install required packages (only need to do this once?)

install.packages(“ggplot2”); # for graphics functions install.packages(“car”); # for the leveneTest() function install.packages(“pastecs”); # for the stat.desc() function install.packages(“psych”); # for the describe() function install.packages(“hrbrthemes”) install.packages(“viridis”)

“call” the required packages (need to do this every session?)

library(car); library(ggplot2); library(pastecs); library(psych); library(hrbrthemes); library(viridis)
Loading required package: carData
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     

Attaching package: ‘psych’

The following objects are masked from ‘package:ggplot2’:

    %+%, alpha

The following object is masked from ‘package:car’:

    logit

Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
      Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
      if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
Loading required package: viridisLite

Use Excel to generate a .csv file with “tidy” data (each row = 1 case / subject, 1st row is column names). Import .CSV file into R “dataframe” called “watermazedata”. Then show the “watermazedata” dataframe (header + 1st 8 data rows) to check it out

watermazedata <- read.csv(file="./data_clean/water maze all.csv", header=TRUE, sep=",")
watermazedata

Derive new variables. Mostly use the rowMeans() function, but these may be useful as well…

Make some new DVs (~“columns”) assigned 1 (TRUE) or 0 (FALSE) based on Boolean calculations: - Less than? watermazedata\(Duration.Spatial2LessThanSpatial1 <- watermazedata\)Duration.Spatial2 < watermazedata\(Duration.Spatial2 - Less than or equal to? watermazedata\)Duration.Spatial1LessThanOrEqualTo60 <- watermazedata\(Duration.Spatial2 <= 60 - Equal to? watermazedata\)Sh <- watermazedata\(Treatment == "Sh" - Not equal to? watermazedata\)NotSh <- watermazedata$Treatment != “Sh”

Use “ifelse” to maybe replace scores (e.g., replace any duration greater than 60 with NA “missing data”, else keep the same) - watermazedata\(Duration.Spatial.Clean <- ifelse(watermazedata\)Duration.Spatial > 60, NA, watermazedata$Duration.Spatial)

# Trials 1-10 for cued, spatial 1, spatial 2 and spatial trials averaged into 5 blocks (2 trials each) each for both Distance and Duration
watermazedata$Duration.Cued.Block1 <- rowMeans(cbind
                                               (watermazedata$Duration.Cued.1,
                                                 watermazedata$Duration.Cued.2),
                                               na.rm = TRUE)
watermazedata$Duration.Cued.Block2 <- rowMeans(cbind
                                               (watermazedata$Duration.Cued.3,
                                                 watermazedata$Duration.Cued.4),
                                               na.rm = TRUE)
watermazedata$Duration.Cued.Block3 <- rowMeans(cbind
                                               (watermazedata$Duration.Cued.5,
                                                 watermazedata$Duration.Cued.6),
                                               na.rm = TRUE)
watermazedata$Duration.Cued.Block4 <- rowMeans(cbind
                                               (watermazedata$Duration.Cued.7,
                                                 watermazedata$Duration.Cued.8),
                                               na.rm = TRUE)
watermazedata$Duration.Cued.Block5 <- rowMeans(cbind
                                               (watermazedata$Duration.Cued.9,
                                                 watermazedata$Duration.Cued.10),
                                               na.rm = TRUE)

watermazedata$Duration.Spatial1.Block1 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial1.1,
                                                     watermazedata$Duration.Spatial1.2),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial1.Block2 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial1.3,
                                                     watermazedata$Duration.Spatial1.4),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial1.Block3 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial1.5,
                                                     watermazedata$Duration.Spatial1.6),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial1.Block4 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial1.7,
                                                     watermazedata$Duration.Spatial1.8),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial1.Block5 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial1.9,
                                                     watermazedata$Duration.Spatial1.10),
                                                   na.rm = TRUE)

watermazedata$Duration.Spatial2.Block1 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial2.1,
                                                     watermazedata$Duration.Spatial2.2),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial2.Block2 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial2.3,
                                                     watermazedata$Duration.Spatial2.4),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial2.Block3 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial2.5,
                                                     watermazedata$Duration.Spatial2.6),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial2.Block4 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial2.7,
                                                     watermazedata$Duration.Spatial2.8),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial2.Block5 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial2.9,
                                                     watermazedata$Duration.Spatial2.10),
                                                   na.rm = TRUE)

watermazedata$Duration.Spatial3.Block1 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial3.1,
                                                     watermazedata$Duration.Spatial3.2),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial3.Block2 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial3.3,
                                                     watermazedata$Duration.Spatial3.4),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial3.Block3 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial3.5,
                                                     watermazedata$Duration.Spatial3.6),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial3.Block4 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial3.7,
                                                     watermazedata$Duration.Spatial3.8),
                                                   na.rm = TRUE)
watermazedata$Duration.Spatial3.Block5 <- rowMeans(cbind
                                                   (watermazedata$Duration.Spatial3.9,
                                                     watermazedata$Duration.Spatial3.10),
                                                   na.rm = TRUE)

watermazedata$Distance.Cued.Block1 <- rowMeans(cbind
                                               (watermazedata$Distance.Cued.1,
                                                 watermazedata$Distance.Cued.2),
                                               na.rm = TRUE)
watermazedata$Distance.Cued.Block2 <- rowMeans(cbind
                                               (watermazedata$Distance.Cued.3,
                                                 watermazedata$Distance.Cued.4),
                                               na.rm = TRUE)
watermazedata$Distance.Cued.Block3 <- rowMeans(cbind
                                               (watermazedata$Distance.Cued.5,
                                                 watermazedata$Distance.Cued.6),
                                               na.rm = TRUE)
watermazedata$Distance.Cued.Block4 <- rowMeans(cbind
                                               (watermazedata$Distance.Cued.7,
                                                 watermazedata$Distance.Cued.8),
                                               na.rm = TRUE)
watermazedata$Distance.Cued.Block5 <- rowMeans(cbind
                                               (watermazedata$Distance.Cued.9,
                                                 watermazedata$Distance.Cued.10),
                                               na.rm = TRUE)

watermazedata$Distance.Spatial1.Block1 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial1.1,
                                                     watermazedata$Distance.Spatial1.2),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial1.Block2 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial1.3,
                                                     watermazedata$Distance.Spatial1.4),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial1.Block3 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial1.5,
                                                     watermazedata$Distance.Spatial1.6),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial1.Block4 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial1.7,
                                                     watermazedata$Distance.Spatial1.8),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial1.Block5 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial1.9,
                                                     watermazedata$Distance.Spatial1.10),
                                                   na.rm = TRUE)

watermazedata$Distance.Spatial2.Block1 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial2.1,
                                                     watermazedata$Distance.Spatial2.2),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial2.Block2 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial2.3,
                                                     watermazedata$Distance.Spatial2.4),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial2.Block3 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial2.5,
                                                     watermazedata$Distance.Spatial2.6),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial2.Block4 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial2.7,
                                                     watermazedata$Distance.Spatial2.8),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial2.Block5 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial2.9,
                                                     watermazedata$Distance.Spatial2.10),
                                                   na.rm = TRUE)

watermazedata$Distance.Spatial3.Block1 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial3.1,
                                                     watermazedata$Distance.Spatial3.2),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial3.Block2 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial3.3,
                                                     watermazedata$Distance.Spatial3.4),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial3.Block3 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial3.5,
                                                     watermazedata$Distance.Spatial3.6),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial3.Block4 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial3.7,
                                                     watermazedata$Distance.Spatial3.8),
                                                   na.rm = TRUE)
watermazedata$Distance.Spatial3.Block5 <- rowMeans(cbind
                                                   (watermazedata$Distance.Spatial3.9,
                                                     watermazedata$Distance.Spatial3.10),
                                                   na.rm = TRUE)

# Cued, spatial 1, spatial 2 and spatial blocks 1-5 averaged into Overall Averages for both Distance and Duration
watermazedata$Duration.Cued <- rowMeans(cbind (watermazedata$Duration.Cued.1,
                                               watermazedata$Duration.Cued.2,
                                               watermazedata$Duration.Cued.3,
                                               watermazedata$Duration.Cued.4,
                                               watermazedata$Duration.Cued.5),
                                        na.rm = TRUE)
watermazedata$Duration.Spatial1 <- rowMeans(cbind (watermazedata$Duration.Spatial1.1,
                                                   watermazedata$Duration.Spatial1.2,
                                                   watermazedata$Duration.Spatial1.3,
                                                   watermazedata$Duration.Spatial1.4,
                                                   watermazedata$Duration.Spatial1.5),
                                            na.rm = TRUE)
watermazedata$Duration.Spatial2 <- rowMeans(cbind (watermazedata$Duration.Spatial2.1,
                                                   watermazedata$Duration.Spatial2.2,
                                                   watermazedata$Duration.Spatial2.3,
                                                   watermazedata$Duration.Spatial2.4,
                                                   watermazedata$Duration.Spatial2.5),
                                            na.rm = TRUE)
watermazedata$Duration.Spatial3 <- rowMeans(cbind (watermazedata$Duration.Spatial3.1,
                                                   watermazedata$Duration.Spatial3.2,
                                                   watermazedata$Duration.Spatial3.3,
                                                   watermazedata$Duration.Spatial3.4,
                                                   watermazedata$Duration.Spatial3.5),
                                            na.rm = TRUE)
watermazedata$Duration.Spatial <- rowMeans(cbind (watermazedata$Duration.Spatial1,
                                                  watermazedata$Duration.Spatial2,
                                                  watermazedata$Duration.Spatial3),
                                           na.rm = TRUE)


watermazedata$Distance.Cued <- rowMeans(cbind (watermazedata$Distance.Cued.1,
                                               watermazedata$Distance.Cued.2,
                                               watermazedata$Distance.Cued.3,
                                               watermazedata$Distance.Cued.4,
                                               watermazedata$Distance.Cued.5),
                                        na.rm = TRUE)
watermazedata$Distance.Spatial1 <- rowMeans(cbind (watermazedata$Distance.Spatial1.1,
                                                   watermazedata$Distance.Spatial1.2,
                                                   watermazedata$Distance.Spatial1.3,
                                                   watermazedata$Distance.Spatial1.4,
                                                   watermazedata$Distance.Spatial1.5),
                                            na.rm = TRUE)
watermazedata$Distance.Spatial2 <- rowMeans(cbind (watermazedata$Distance.Spatial2.1,
                                                   watermazedata$Distance.Spatial2.2,
                                                   watermazedata$Distance.Spatial2.3,
                                                   watermazedata$Distance.Spatial2.4,
                                                   watermazedata$Distance.Spatial2.5),
                                            na.rm = TRUE)
watermazedata$Distance.Spatial3 <- rowMeans(cbind (watermazedata$Distance.Spatial3.1,
                                                   watermazedata$Distance.Spatial3.2,
                                                   watermazedata$Distance.Spatial3.3,
                                                   watermazedata$Distance.Spatial3.4,
                                                   watermazedata$Distance.Spatial3.5),
                                            na.rm = TRUE)
watermazedata$Distance.Spatial <- rowMeans(cbind (watermazedata$Distance.Spatial1,
                                                  watermazedata$Distance.Spatial2,
                                                  watermazedata$Distance.Spatial3),
                                           na.rm = TRUE)

# Make a Speed variable (Distance/Duration)
watermazedata$Speed <- watermazedata$Distance.Spatial / watermazedata$Duration.Spatial

# Make working memory variables
watermazedata$Working.Duration.Trial1.1 <- watermazedata$Duration.Spatial1.1
watermazedata$Working.Duration.Trial2.1 <- watermazedata$Duration.Spatial1.2
watermazedata$Working.Duration.Diff.1 <- watermazedata$Duration.Spatial1.1 - watermazedata$Duration.Spatial1.2

watermazedata$Working.Duration.Trial1.2 <- watermazedata$Duration.Spatial2.1
watermazedata$Working.Duration.Trial2.2 <- watermazedata$Duration.Spatial2.2
watermazedata$Working.Duration.Diff.2 <- watermazedata$Duration.Spatial2.1 - watermazedata$Duration.Spatial2.2

watermazedata$Working.Duration.Trial1.3 <- watermazedata$Duration.Spatial3.1
watermazedata$Working.Duration.Trial2.3 <- watermazedata$Duration.Spatial3.2
watermazedata$Working.Duration.Diff.3 <- watermazedata$Duration.Spatial3.1 - watermazedata$Duration.Spatial3.2

watermazedata$Working.Duration.Trial1.Ave <- (watermazedata$Duration.Spatial1.1 + watermazedata$Duration.Spatial2.1 + watermazedata$Duration.Spatial3.1) / 3
watermazedata$Working.Duration.Trial2.Ave <- (watermazedata$Duration.Spatial1.2 + watermazedata$Duration.Spatial2.2 + watermazedata$Duration.Spatial3.2) / 3
watermazedata$Working.Duration.Diff.Ave <- (watermazedata$Working.Duration.Diff.1 + watermazedata$Working.Duration.Diff.2 + watermazedata$Working.Duration.Diff.3) / 3


watermazedata$Working.Distance.Trial1.1 <- watermazedata$Distance.Spatial1.1
watermazedata$Working.Distance.Trial2.1 <- watermazedata$Distance.Spatial1.2
watermazedata$Working.Distance.Diff.1 <- watermazedata$Distance.Spatial1.1 - watermazedata$Distance.Spatial1.2

watermazedata$Working.Distance.Trial1.2 <- watermazedata$Distance.Spatial2.1
watermazedata$Working.Distance.Trial2.2 <- watermazedata$Distance.Spatial2.2
watermazedata$Working.Distance.Diff.2 <- watermazedata$Distance.Spatial2.1 - watermazedata$Distance.Spatial2.2

watermazedata$Working.Distance.Trial1.3 <- watermazedata$Distance.Spatial3.1
watermazedata$Working.Distance.Trial2.3 <- watermazedata$Distance.Spatial3.2
watermazedata$Working.Distance.Diff.3 <- watermazedata$Distance.Spatial3.1 - watermazedata$Distance.Spatial3.2

watermazedata$Working.Distance.Trial1.Ave <- (watermazedata$Distance.Spatial1.1 + watermazedata$Distance.Spatial2.1 + watermazedata$Distance.Spatial3.1) / 3
watermazedata$Working.Distance.Trial2.Ave <- (watermazedata$Distance.Spatial1.2 + watermazedata$Distance.Spatial2.2 + watermazedata$Distance.Spatial3.2) / 3
watermazedata$Working.Distance.Diff.Ave <- (watermazedata$Working.Distance.Diff.1 + watermazedata$Working.Distance.Diff.2 + watermazedata$Working.Distance.Diff.3) / 3

Create a “subset” dataframe for each group to ease making histograms/normal curves and QQ plots by group.

Ac_watermazedata<-subset(watermazedata, watermazedata$Treatment=="Ac")
Fx_watermazedata<-subset(watermazedata, watermazedata$Treatment=="Fx")
Sh_watermazedata<-subset(watermazedata, watermazedata$Treatment=="Sh")

How many subjects are missing data from a specific column? (na = ‘missing’). Make a variable that returns 1 (TRUE) if data is missing: watermazedata\(Duration.Spatial1.Missing <- is.na(watermazedata\)Duration.Spatial1)

How many subjects are missing from Duration.Spatial1 data? sum(watermazedata$Duration.Spatial1.Missing)

1 = missing, 0 = there, so mean will tell us proportion of cases missing data in that variable

….or simply calculate this WITHOUT making a new variable:

sum(is.na(watermazedata$Duration.Cued)); mean(is.na(watermazedata$Duration.Cued))
[1] 0
[1] 0
sum(is.na(watermazedata$Duration.Spatial1)); mean(is.na(watermazedata$Duration.Spatial1))
[1] 0
[1] 0
sum(is.na(watermazedata$Duration.Spatial2)); mean(is.na(watermazedata$Duration.Spatial2))
[1] 0
[1] 0
sum(is.na(watermazedata$Duration.Spatial3)); mean(is.na(watermazedata$Duration.Spatial3))
[1] 0
[1] 0
sum(is.na(watermazedata$Duration.Spatial)); mean(is.na(watermazedata$Duration.Spatial))
[1] 0
[1] 0
sum(is.na(watermazedata$Distance.Cued)); mean(is.na(watermazedata$Distance.Cued))
[1] 0
[1] 0
sum(is.na(watermazedata$Distance.Spatial1)); mean(is.na(watermazedata$Distance.Spatial1))
[1] 0
[1] 0
sum(is.na(watermazedata$Distance.Spatial2)); mean(is.na(watermazedata$Distance.Spatial2))
[1] 0
[1] 0
sum(is.na(watermazedata$Distance.Spatial3)); mean(is.na(watermazedata$Distance.Spatial3))
[1] 0
[1] 0
sum(is.na(watermazedata$Distance.Spatial)); mean(is.na(watermazedata$Distance.Spatial))
[1] 0
[1] 0
sum(is.na(watermazedata$Speed)); mean(is.na(watermazedata$Speed))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Entries.1)); mean(is.na(watermazedata$Probe.Entries.1))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Entries.2)); mean(is.na(watermazedata$Probe.Entries.2))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Entries.3)); mean(is.na(watermazedata$Probe.Entries.3))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Entries.Ave)); mean(is.na(watermazedata$Probe.Entries.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Percent1)); mean(is.na(watermazedata$Probe.Percent1))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Percent2)); mean(is.na(watermazedata$Probe.Percent2))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Percent3)); mean(is.na(watermazedata$Probe.Percent3))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Percent.Ave)); mean(is.na(watermazedata$Probe.Percent.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe2.Opposite.Percent)); mean(is.na(watermazedata$Probe2.Opposite.Percent))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Duration.Trial1.Ave)); mean(is.na(watermazedata$Working.Duration.Trial1.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Duration.Trial2.Ave)); mean(is.na(watermazedata$Working.Duration.Trial2.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Duration.Diff.Ave)); mean(is.na(watermazedata$Working.Duration.Diff.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Distance.Trial1.Ave)); mean(is.na(watermazedata$Working.Distance.Trial1.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Distance.Trial2.Ave)); mean(is.na(watermazedata$Working.Distance.Trial2.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Distance.Diff.Ave)); mean(is.na(watermazedata$Working.Distance.Diff.Ave))
[1] 0
[1] 0

Now, start checking the various aussumptions (normality, homogeneity of variance, etc.) for all meaningful DVS - e.g., Average Distance and Distance for days 1-3 are probably important, but Blocks 1-5 from each are probably not (?). If the idea is to compare groups, the assumptions need to be tested with each variable broken down by group.

??? is there a “Bonferroni correction” for multiple tests of Normality etc ???

Generate some descriptive stats for the variables of interest.

NOTE: For output reported using “e”: e+02, simply “move” the decimal point 2 places to right. e-02 = move decimal 2 places to left…

Can use describe() (from the psych package) or stat.desc() function (from the pastecs package) to get some basic stats.

# describe()
# Overall DVs (not broken down by group)
# single variables: by(data = dataFrame$Variable, INDICES = dataFrame$grouping DV, FUN = function)
# by(data = watermazedata$Duration.Spatial, INDICES = watermazedata$Treatment, FUN = describe)
# or
# by(watermazedata$Duration.Spatial, watermazedata$Treatment, describe)
# multiple variables at once:
# describe(cbind(watermazedata$Duration.Cued,
#                watermazedata$Duration.Spatial1,
#                watermazedata$Duration.Spatial2,
#                watermazedata$Duration.Spatial3,
#                watermazedata$Duration.Spatial,
#                watermazedata$Distance.Cued,
#                watermazedata$Distance.Spatial1,
#                watermazedata$Distance.Spatial2,
#                watermazedata$Distance.Spatial3,
#                watermazedata$Distance.Spatial,
#                watermazedata$Speed,
#                watermazedata$Probe.Entries.1,
#                watermazedata$Probe.Entries.2,
#                watermazedata$Probe.Entries.3,
#                watermazedata$Probe.Entries.Ave,
#                watermazedata$Probe.Percent1,
#                watermazedata$Probe.Percent2,
#                watermazedata$Probe.Percent3,
#                watermazedata$Probe.Percent.Ave,
#                watermazedata$Probe2.Opposite.Percent,
#                watermazedata$Working.Duration.Trial1.Ave,
#                watermazedata$Working.Duration.Trial2.Ave,
#                watermazedata$Working.Duration.Diff.Ave,
#                watermazedata$Working.Distance.Trial1.Ave,
#                watermazedata$Working.Distance.Trial2.Ave,
#                watermazedata$Working.Distance.Diff.Ave))
# or
# describe(watermazedata[,c("Duration.Spatial1",
#                          "Duration.Spatial2",
#                          "Duration.Spatial3")]); # ETC

# broken down by group
#by(cbind(Duration.Cued=watermazedata$Duration.Cued,
#         Duration.Spatial1=watermazedata$Duration.Spatial1,
#         Duration.Spatial2=watermazedata$Duration.Spatial2,
#         Duration.Spatial3=watermazedata$Duration.Spatial3,
#         Duration.Spatial=watermazedata$Duration.Spatial,
#         Distance.Cued=watermazedata$Distance.Cued,
#         Distance.Spatial1=watermazedata$Distance.Spatial1,
#         Distance.Spatial2=watermazedata$Distance.Spatial2,
#         Distance.Spatial3=watermazedata$Distance.Spatial3,
#         Distance.Spatial=watermazedata$Distance.Spatial,
#         Speed=watermazedata$Speed,
#         Probe.Entries.1=watermazedata$Probe.Entries.1,
#         Probe.Entries.2=watermazedata$Probe.Entries.2,
#         Probe.Entries.3=watermazedata$Probe.Entries.3,
#         Probe.Entries.Ave=watermazedata$Probe.Entries.Ave,
#         Probe.Percent1=watermazedata$Probe.Percent1,
#         Probe.Percent2=watermazedata$Probe.Percent2,
#         Probe.Percent3=watermazedata$Probe.Percent3,
#         Probe.Percent.Ave=watermazedata$Probe.Percent.Ave,
#         Probe2.Opposite.Percent=watermazedata$Probe2.Opposite.Percent,
#         Working.Duration.Trial1.Ave=watermazedata$Working.Duration.Trial1.Ave,
#         Working.Duration.Trial2.Ave=watermazedata$Working.Duration.Trial2.Ave,
#         Working.Duration.Diff.Ave=watermazedata$Working.Duration.Diff.Ave,
#         Working.Distance.Trial1.Ave=watermazedata$Working.Distance.Trial1.Ave,
#         Working.Distance.Trial2.Ave=watermazedata$Working.Distance.Trial2.Ave,
#         Working.Distance.Diff.Ave=watermazedata$Working.Distance.Diff.Ave),
#   watermazedata$Treatment, describe)

# normality of overall variables
# shapiro.test(watermazedata$Duration.Cued)
# shapiro.test(watermazedata$Duration.Spatial1)
# shapiro.test(watermazedata$Duration.Spatial2)
# shapiro.test(watermazedata$Duration.Spatial3)
# shapiro.test(watermazedata$Duration.Spatial)
# shapiro.test(watermazedata$Distance.Cued)
# shapiro.test(watermazedata$Distance.Spatial1)
# shapiro.test(watermazedata$Distance.Spatial2)
# shapiro.test(watermazedata$Distance.Spatial3)
# shapiro.test(watermazedata$Distance.Spatial)
# shapiro.test(watermazedata$Speed)
# shapiro.test(watermazedata$Probe.Entries.1)
# shapiro.test(watermazedata$Probe.Entries.2)
# shapiro.test(watermazedata$Probe.Entries.3)
# shapiro.test(watermazedata$Probe.Entries.Ave)
# shapiro.test(watermazedata$Probe.Percent1)
# shapiro.test(watermazedata$Probe.Percent2)
# shapiro.test(watermazedata$Probe.Percent3)
# shapiro.test(watermazedata$Probe.Percent.Ave)
# shapiro.test(watermazedata$Probe2.Opposite.Percent)
# shapiro.test(watermazedata$Working.Duration.Trial1.Ave)
# shapiro.test(watermazedata$Working.Duration.Trial2.Ave)
# shapiro.test(watermazedata$Working.Duration.Diff.Ave)
# shapiro.test(watermazedata$Working.Distance.Trial1.Ave)
# shapiro.test(watermazedata$Working.Distance.Trial2.Ave)
# shapiro.test(watermazedata$Working.Distance.Diff.Ave)

# normality of variables broken down by group
# by(watermazedata$Duration.Cued, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Duration.Spatial1, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Duration.Spatial2, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Duration.Spatial3, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Duration.Spatial, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Distance.Cued, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Distance.Spatial1, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Distance.Spatial2, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Distance.Spatial3, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Distance.Spatial, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Speed, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Entries.1, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Entries.2, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Entries.3, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Entries.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Percent1, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Percent2, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Percent3, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Percent.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe2.Opposite.Percent, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Duration.Trial1.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Duration.Trial2.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Duration.Diff.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Distance.Trial1.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Distance.Trial2.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Distance.Diff.Ave, watermazedata$Treatment, shapiro.test)

Using stat.desc


# stat.desc()
# using basic = FALSE adds Shapiro-Wilks test, negating the need to run that separately as with describe()
# Overall DVs (not broken down by group)
stat.desc(cbind(Duration.Cued=watermazedata$Duration.Cued,
                Duration.Spatial1=watermazedata$Duration.Spatial1,
                Duration.Spatial2=watermazedata$Duration.Spatial2,
                Duration.Spatial3=watermazedata$Duration.Spatial3,
                Duration.Spatial=watermazedata$Duration.Spatial,
                Distance.Cued=watermazedata$Distance.Cued,
                Distance.Spatial1=watermazedata$Distance.Spatial1,
                Distance.Spatial2=watermazedata$Distance.Spatial2,
                Distance.Spatial3=watermazedata$Distance.Spatial3,
                Distance.Spatial=watermazedata$Distance.Spatial,
                Speed=watermazedata$Speed,
                Probe.Entries.1=watermazedata$Probe.Entries.1,
                Probe.Entries.2=watermazedata$Probe.Entries.2,
                Probe.Entries.3=watermazedata$Probe.Entries.3,
                Probe.Entries.Ave=watermazedata$Probe.Entries.Ave,
                Probe.Percent1=watermazedata$Probe.Percent1,
                Probe.Percent2=watermazedata$Probe.Percent2,
                Probe.Percent3=watermazedata$Probe.Percent3,
                Probe.Percent.Ave=watermazedata$Probe.Percent.Ave,
                Probe2.Opposite.Percent=watermazedata$Probe2.Opposite.Percent,
                Working.Duration.Trial1.Ave=watermazedata$Working.Duration.Trial1.Ave,
                Working.Duration.Trial2.Ave=watermazedata$Working.Duration.Trial2.Ave,
                Working.Duration.Diff.Ave=watermazedata$Working.Duration.Diff.Ave,
                Working.Distance.Trial1.Ave=watermazedata$Working.Distance.Trial1.Ave,
                Working.Distance.Trial2.Ave=watermazedata$Working.Distance.Trial2.Ave,
                Working.Distance.Diff.Ave=watermazedata$Working.Distance.Diff.Ave),
          basic = FALSE, norm = TRUE)
# or
# stat.desc(watermazedata[, c("Duration.Spatial1",
#                            "Duration.Spatial2",
#                            "Duration.Spatial3")], basic = FALSE, norm = TRUE); # ETC

# Broken down by group
# single variables: by(data = dataFrame$Variable, INDICES = dataFrame$grouping DV, FUN = function)
# by(data = watermazedata$Duration.Spatial, INDICES = watermazedata$Treatment, FUN = stat.desc)
# or
# by(watermazedata$Duration.Spatial, watermazedata$Treatment, stat.desc)
# or
# by(watermazedata$Duration.Spatial, watermazedata$Treatment, stat.desc, basic = FALSE, norm = TRUE)
# multiple variables at once:
by(cbind(Duration.Cued=watermazedata$Duration.Cued,
         Duration.Spatial1=watermazedata$Duration.Spatial1,
         Duration.Spatial2=watermazedata$Duration.Spatial2,
         Duration.Spatial3=watermazedata$Duration.Spatial3,
         Duration.Spatial=watermazedata$Duration.Spatial,
         Distance.Cued=watermazedata$Distance.Cued,
         Distance.Spatial1=watermazedata$Distance.Spatial1,
         Distance.Spatial2=watermazedata$Distance.Spatial2,
         Distance.Spatial3=watermazedata$Distance.Spatial3,
         Distance.Spatial=watermazedata$Distance.Spatial,
         Speed=watermazedata$Speed,
         Probe.Entries.1=watermazedata$Probe.Entries.1,
         Probe.Entries.2=watermazedata$Probe.Entries.2,
         Probe.Entries.3=watermazedata$Probe.Entries.3,
         Probe.Entries.Ave=watermazedata$Probe.Entries.Ave,
         Probe.Percent1=watermazedata$Probe.Percent1,
         Probe.Percent2=watermazedata$Probe.Percent2,
         Probe.Percent3=watermazedata$Probe.Percent3,
         Probe.Percent.Ave=watermazedata$Probe.Percent.Ave,
         Probe2.Opposite.Percent=watermazedata$Probe2.Opposite.Percent),
   watermazedata$Treatment, stat.desc, basic = FALSE, norm = TRUE)
INDICES: Ac
             Duration.Cued Duration.Spatial1 Duration.Spatial2 Duration.Spatial3
median          22.3900000       14.36000000       15.54000000       17.19000000
mean            23.6470000       14.98000000       18.94100000       21.35800000
SE.mean          1.6968797        1.77887487        2.27763010        2.43156865
CI.mean.0.95     3.5516099        3.72322788        4.76713460        5.08933168
var             57.5880116       63.28791579      103.75197789      118.25052211
std.dev          7.5886765        7.95537025       10.18587148       10.87430559
coef.var         0.3209150        0.53106610        0.53776841        0.50914438
skewness         0.2479948        1.26212085        0.94110222        0.73566280
skew.2SE         0.2421335        1.23229118        0.91885968        0.71827573
kurtosis        -1.1792491        1.97484499        0.31484533       -0.60321900
kurt.2SE        -0.5941498        0.99500081        0.15863086       -0.30392430
normtest.W       0.9608703        0.87806268        0.91348508        0.91465100
normtest.p       0.5613788        0.01633146        0.07429047        0.07820961
             Duration.Spatial Distance.Cued Distance.Spatial1 Distance.Spatial2
median             18.0066667     3.4727000        2.19760000         2.4629000
mean               18.4263333     3.6469100        2.34443000         2.7195600
SE.mean             1.0939434     0.2324343        0.34439751         0.3433361
CI.mean.0.95        2.2896498     0.4864905        0.72083228         0.7186106
var                23.9342432     1.0805138        2.37219293         2.3575929
std.dev             4.8922636     1.0394776        1.54019250         1.5354455
coef.var            0.2655039     0.2850297        0.65695819         0.5645934
skewness            0.2518218     0.5425664        1.34133180         0.8403708
skew.2SE            0.2458701     0.5297431        1.30963002         0.8205091
kurtosis           -0.5840827    -0.8509631        2.25394485         0.3936414
kurt.2SE           -0.2942827    -0.4287470        1.13562176         0.1983313
normtest.W          0.9801489     0.9417958        0.87785717         0.9280982
normtest.p          0.9360099     0.2592150        0.01619371         0.1419282
             Distance.Spatial3 Distance.Spatial         Speed Probe.Entries.1
median              2.34980000        2.6594667  0.1444310179       3.5000000
mean                3.08606000        2.7166833  0.1467410626       3.7000000
SE.mean             0.40930437        0.1810658  0.0023242164       0.4298102
CI.mean.0.95        0.85668390        0.3789751  0.0048646408       0.8996032
var                 3.35060138        0.6556967  0.0001080396       3.6947368
std.dev             1.83046480        0.8097510  0.0103942117       1.9221698
coef.var            0.59313973        0.2980660  0.0708336951       0.5195054
skewness            0.70812629        0.6477020 -0.0297399089       0.2374009
skew.2SE            0.69139004        0.6323939 -0.0290370192       0.2317900
kurtosis           -0.94451685        0.4876389 -0.4892196484      -0.4419827
kurt.2SE           -0.47588294        0.2456907 -0.2464871660      -0.2226874
normtest.W          0.88665782        0.9401439  0.9760920947       0.9704263
normtest.p          0.02335664        0.2412871  0.8743843994       0.7638524
             Probe.Entries.2 Probe.Entries.3 Probe.Entries.Ave Probe.Percent1
median             5.0000000       5.0000000        5.00000000    33.58500000
mean               5.4000000       4.8500000        4.60000000    34.28200000
SE.mean            0.6341177       0.5585460        0.29379549     3.17795114
CI.mean.0.95       1.3272236       1.1690503        0.61492103     6.65152819
var                8.0421053       6.2394737        1.72631579   201.98746947
std.dev            2.8358606       2.4978938        1.31389337    14.21222957
coef.var           0.5251594       0.5150297        0.28562899     0.41456827
skewness           0.7176968       0.3927197       -0.47085901    -0.05372888
skew.2SE           0.7007343       0.3834380       -0.45973047    -0.05245902
kurtosis          -0.3181295      -0.3691493       -0.48631469    -1.14227338
kurt.2SE          -0.1602855      -0.1859912       -0.24502354    -0.57552007
normtest.W         0.9332753       0.9271466        0.90536342     0.97187672
normtest.p         0.1784997       0.1360601        0.05203957     0.79392004
             Probe.Percent2 Probe.Percent3 Probe.Percent.Ave
median          41.25000000    36.50000000        36.7500000
mean            39.20000000    33.88300000        35.7890000
SE.mean          2.56736441     1.85310608         1.2512964
CI.mean.0.95     5.37355546     3.87859561         2.6189934
var            131.82720000    68.68004316        31.3148516
std.dev         11.48160268     8.28734235         5.5959674
coef.var         0.29289803     0.24458703         0.1563600
skewness        -0.94601833    -0.95143892        -0.4572726
skew.2SE        -0.92365960    -0.92895208        -0.4464651
kurtosis         0.29968759    -0.21830216        -0.4986564
kurt.2SE         0.15099382    -0.10998880        -0.2512418
normtest.W       0.91907919     0.88425152         0.9543853
normtest.p       0.09512401     0.02111589         0.4385766
             Probe2.Opposite.Percent
median                    18.0000000
mean                      20.2990000
SE.mean                    1.5917789
CI.mean.0.95               3.3316314
var                       50.6751989
std.dev                    7.1186515
coef.var                   0.3506898
skewness                   0.6760278
skew.2SE                   0.6600502
kurtosis                  -0.5215679
kurt.2SE                  -0.2627854
normtest.W                 0.9295934
normtest.p                 0.1516587
--------------------------------------------------------------- 
INDICES: Fx
             Duration.Cued Duration.Spatial1 Duration.Spatial2 Duration.Spatial3
median         21.73000000        12.4300000      1.755000e+01       21.40000000
mean           23.37222222        12.7988889      2.153222e+01       23.43777778
SE.mean         2.23278843         1.2639398      2.967962e+00        3.15191648
CI.mean.0.95    4.71077180         2.6666798      6.261853e+00        6.64996249
var            89.73619477        28.7557869      1.585584e+02      178.82239477
std.dev         9.47291902         5.3624423      1.259200e+01       13.37244909
coef.var        0.40530673         0.4189772      5.847979e-01        0.57055107
skewness        0.81041711         0.3882022      1.272045e+00        0.50503295
skew.2SE        0.75559436         0.3619413      1.185994e+00        0.47086870
kurtosis        0.10639342        -1.0798882      7.314238e-01       -1.16154284
kurt.2SE        0.05125936        -0.5202800      3.523932e-01       -0.55962051
normtest.W      0.86919556         0.9360768      8.435289e-01        0.90640023
normtest.p      0.01725848         0.2480028      6.706633e-03        0.07435655
             Duration.Spatial Distance.Cued Distance.Spatial1 Distance.Spatial2
median            19.99666667    3.69610000        1.62460000       2.210800000
mean              19.25629630    3.98997778        1.98138889       2.894511111
SE.mean            1.42361882    0.38879126        0.26145987       0.425809855
CI.mean.0.95       3.00357317    0.82027787        0.55163210       0.898380264
var               36.48042992    2.72085565        1.23050271       3.263652580
std.dev            6.03990314    1.64950164        1.10928027       1.806558214
coef.var           0.31365861    0.41341123        0.55984985       0.624132416
skewness          -0.18478275    0.62065506        0.67394281       1.130473609
skew.2SE          -0.17228264    0.57866925        0.62835222       1.053999812
kurtosis          -1.68798788   -0.23498226       -0.86690831       0.205166745
kurt.2SE          -0.81325683   -0.11321226       -0.41766834       0.098847426
normtest.W         0.88880514    0.88847894        0.90114980       0.846707522
normtest.p         0.03681698    0.03634723        0.06017156       0.007517738
             Distance.Spatial3 Distance.Spatial        Speed Probe.Entries.1
median              2.94920000        2.8016333  0.134896814       4.0000000
mean                3.16536667        2.6804222  0.138482061       4.3333333
SE.mean             0.48732298        0.2206222  0.004480923       0.7094138
CI.mean.0.95        1.02816161        0.4654721  0.009453920       1.4967323
var                 4.27470629        0.8761347  0.000361416       9.0588235
std.dev             2.06753628        0.9360207  0.019010944       3.0097880
coef.var            0.65317434        0.3492064  0.137280918       0.6945665
skewness            0.44035925       -0.1121716 -0.109850417       0.5406443
skew.2SE            0.41057002       -0.1045835 -0.102419303       0.5040710
kurtosis           -1.29548429       -1.3864203 -1.287317657      -0.7907476
kurt.2SE           -0.62415226       -0.6679644 -0.620217651      -0.3809748
normtest.W          0.89269316        0.9480545  0.956655741       0.9386126
normtest.p          0.04293112        0.3953187  0.538577561       0.2743302
             Probe.Entries.2 Probe.Entries.3 Probe.Entries.Ave Probe.Percent1
median             4.5000000      4.00000000        4.00000000    35.41500000
mean               4.6111111      3.61111111        4.16666667    39.11166667
SE.mean            0.5724554      0.38039272        0.45911253     3.49474089
CI.mean.0.95       1.2077753      0.80255848        0.96864276     7.37325877
var                5.8986928      2.60457516        3.79411765   219.83785000
std.dev            2.4287225      1.61386962        1.94784949    14.82692989
coef.var           0.5267109      0.44691774        0.46748388     0.37909225
skewness           0.8494462     -0.26808635        0.63646389     1.06294974
skew.2SE           0.7919832     -0.24995096        0.59340865     0.99104377
kurtosis           0.3982610      0.03711183        0.09433583     0.16236708
kurt.2SE           0.1918785      0.01788013        0.04545013     0.07822695
normtest.W         0.9326035      0.94329048        0.91525179     0.88015311
normtest.p         0.2157300      0.32956448        0.10652068     0.02625901
             Probe.Percent2 Probe.Percent3 Probe.Percent.Ave
median          35.50000000     30.5000000      34.775000000
mean            37.07388889     28.4633333      34.882222222
SE.mean          2.92394623      1.9470360       1.891559435
CI.mean.0.95     6.16898729      4.1078868       3.990841562
var            153.89030752     68.2370824      64.403947712
std.dev         12.40525322      8.2605740       8.025207020
coef.var         0.33460890      0.2902181       0.230065819
skewness         0.08594422     -0.9333001      -0.006024109
skew.2SE         0.08013030     -0.8701646      -0.005616592
kurtosis        -0.57837040      0.3594684      -0.002432449
kurt.2SE        -0.27865347      0.1731885      -0.001171931
normtest.W       0.97685565      0.9194261       0.979925163
normtest.p       0.91192507      0.1262816       0.949237025
             Probe2.Opposite.Percent
median                   18.58000000
mean                     20.13000000
SE.mean                   2.23206915
CI.mean.0.95              4.70925426
var                      89.67838824
std.dev                   9.46986738
coef.var                  0.47043554
skewness                  0.70679512
skew.2SE                  0.65898214
kurtosis                  0.05188936
kurt.2SE                  0.02499981
normtest.W                0.94387323
normtest.p                0.33708159
--------------------------------------------------------------- 
INDICES: Sh
             Duration.Cued Duration.Spatial1 Duration.Spatial2 Duration.Spatial3
median         23.06000000       12.08000000        15.5400000        22.4200000
mean           25.09789474       13.82210526        19.0052632        25.8894737
SE.mean         2.63775418        1.50982350         1.8363196         2.4306471
CI.mean.0.95    5.54171590        3.17202147         3.8579644         5.1066001
var           132.19719532       43.31177310        64.0693263       112.2528608
std.dev        11.49770392        6.58116806         8.0043317        10.5949451
coef.var        0.45811428        0.47613355         0.4211640         0.4092376
skewness        0.79198208        0.83572880         0.4171269         0.6594636
skew.2SE        0.75604471        0.79780636         0.3981992         0.6295394
kurtosis       -0.49113414       -0.51161321        -1.1723783         0.9363186
kurt.2SE       -0.24211217       -0.25220764        -0.5779420         0.4615727
normtest.W      0.90845887        0.88784203         0.9197108         0.9276883
normtest.p      0.06936469        0.02947699         0.1117835         0.1569926
             Duration.Spatial Distance.Cued Distance.Spatial1 Distance.Spatial2
median             18.8733333    3.31400000        2.33220000        2.36080000
mean               19.5722807    3.91464211        2.17807368        2.73778947
SE.mean             1.0525935    0.42612757        0.26426884        0.29181399
CI.mean.0.95        2.2114168    0.89526079        0.55520824        0.61307845
var                21.0511075    3.45010934        1.32692242        1.61795274
std.dev             4.5881486    1.85744699        1.15192119        1.27198771
coef.var            0.2344207    0.47448705        0.52887154        0.46460392
skewness            0.5303294    0.89863537        0.76850264        0.61738279
skew.2SE            0.5062650    0.85785845        0.73363069        0.58936812
kurtosis           -0.3497901   -0.42806821       -0.27891088       -0.03764729
kurt.2SE           -0.1724345   -0.21102284       -0.13749343       -0.01855881
normtest.W          0.9634343    0.87435266        0.90134888        0.95201279
normtest.p          0.6416063    0.01714434        0.05146746        0.42730327
             Distance.Spatial3 Distance.Spatial         Speed Probe.Entries.1
median              3.80020000       2.79413333  0.1534098787    5.0000000000
mean                3.98161053       2.96582456  0.1507638122    4.1578947368
SE.mean             0.40007061       0.20119798  0.0037067999    0.5029919715
CI.mean.0.95        0.84051716       0.42270127  0.0077876976    1.0567469189
var                 3.04107338       0.76913191  0.0002610669    4.8070175439
std.dev             1.74386736       0.87700166  0.0161575662    2.1924911730
coef.var            0.43798040       0.29570247  0.1071713824    0.5273080036
skewness            0.27448847       1.30140677 -0.3163322606   -0.8492536425
skew.2SE            0.26203314       1.24235349 -0.3019782125   -0.8107174918
kurtosis            0.04990615       1.89038983  0.4644608256   -0.7281113771
kurt.2SE            0.02460201       0.93189689  0.2289631446   -0.3589337600
normtest.W          0.98061264       0.87112946  0.9445009017    0.7872014119
normtest.p          0.94920809       0.01509693  0.3172627904    0.0007493052
             Probe.Entries.2 Probe.Entries.3 Probe.Entries.Ave Probe.Percent1
median            6.00000000       4.0000000        5.00000000     32.3300000
mean              6.42105263       4.0526316        4.78947368     33.2978947
SE.mean           0.65923839       0.5897451        0.38676154      3.2100484
CI.mean.0.95      1.38500847       1.2390085        0.81255584      6.7440615
var               8.25730994       6.6081871        2.84210526    195.7838064
std.dev           2.87355354       2.5706394        1.68585446     13.9922767
coef.var          0.44752063       0.6343136        0.35199159      0.4202151
skewness          0.38337532       0.2609263        0.51064922     -0.5070319
skew.2SE          0.36597909       0.2490864        0.48747775     -0.4840245
kurtosis         -1.23833007      -1.5641787       -1.00939320     -0.4344221
kurt.2SE         -0.61045395      -0.7710861       -0.49759598     -0.2141551
normtest.W        0.89668584       0.8792907        0.88283992      0.9530587
normtest.p        0.04239384       0.0208689        0.02406722      0.4447327
             Probe.Percent2 Probe.Percent3 Probe.Percent.Ave
median           43.1700000     31.3300000       34.22000000
mean             42.3352632     31.9468421       35.86052632
SE.mean           2.1079617      2.2356719        1.64424594
CI.mean.0.95      4.4286632      4.6969723        3.45443254
var              84.4265485     94.9663450       51.36734971
std.dev           9.1883921      9.7450677        7.16710190
coef.var          0.2170387      0.3050401        0.19986048
skewness         -0.3808935      0.5854291       -0.09526113
skew.2SE         -0.3636099      0.5588644       -0.09093851
kurtosis         -0.9750009     -0.8419064       -1.24496141
kurt.2SE         -0.4806418     -0.4150308       -0.61372297
normtest.W        0.9472765      0.9320952        0.96071802
normtest.p        0.3548309      0.1892693        0.58660667
             Probe2.Opposite.Percent
median                    17.3300000
mean                      17.7100000
SE.mean                    1.2207154
CI.mean.0.95               2.5646280
var                       28.3127778
std.dev                    5.3209753
coef.var                   0.3004503
skewness                   0.4735778
skew.2SE                   0.4520885
kurtosis                  -0.7236955
kurt.2SE                  -0.3567569
normtest.W                 0.9488611
normtest.p                 0.3778937
# or
# by(watermazedata[, c("Duration.Spatial1",
#                     "Duration.Spatial1",
#                     "Duration.Spatial3")],; #ETC
#   watermazedata$Treatment, stat.desc, basic = FALSE, norm = TRUE)

Test for homogeneity of variance among groups using the leveneTest() function from the car package (default uses median)… to use mean instead of median - for example: leveneTest(watermazedata\(Duration.Spatial, watermazedata\)Treatment, center = mean)


leveneTest(watermazedata$Duration.Cued, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.9112 0.4081
      54               
leveneTest(watermazedata$Duration.Spatial1, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.3835 0.6833
      54               
leveneTest(watermazedata$Duration.Spatial2, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2   0.363 0.6973
      54               
leveneTest(watermazedata$Duration.Spatial3, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.9983 0.3752
      54               
leveneTest(watermazedata$Duration.Spatial, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value  Pr(>F)  
group  2  2.4787 0.09335 .
      54                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
leveneTest(watermazedata$Distance.Cued, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  1.2023 0.3084
      54               
leveneTest(watermazedata$Distance.Spatial1, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.1913 0.8265
      54               
leveneTest(watermazedata$Distance.Spatial2, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.4073 0.6675
      54               
leveneTest(watermazedata$Distance.Spatial3, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.5724 0.5676
      54               
leveneTest(watermazedata$Distance.Spatial, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.9525 0.3921
      54               
leveneTest(watermazedata$Speed, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)  
group  2  3.4883 0.0376 *
      54                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
leveneTest(watermazedata$Probe.Entries.1, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  1.4818 0.2363
      54               
leveneTest(watermazedata$Probe.Entries.2, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.2239 0.8002
      54               
leveneTest(watermazedata$Probe.Entries.3, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2   2.231 0.1172
      54               
leveneTest(watermazedata$Probe.Entries.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.9072 0.4097
      54               
leveneTest(watermazedata$Probe.Percent1, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.0387  0.962
      54               
leveneTest(watermazedata$Probe.Percent2, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.3962 0.6748
      54               
leveneTest(watermazedata$Probe.Percent3, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.4923 0.6139
      54               
leveneTest(watermazedata$Probe.Percent.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.9529  0.392
      54               
leveneTest(watermazedata$Probe2.Opposite.Percent, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2   1.456 0.2422
      54               
leveneTest(watermazedata$Working.Duration.Trial1.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.1796 0.8361
      54               
leveneTest(watermazedata$Working.Duration.Trial2.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.1042 0.9012
      54               
leveneTest(watermazedata$Working.Duration.Diff.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2   1.123 0.3328
      54               
leveneTest(watermazedata$Working.Distance.Trial1.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.3452 0.7096
      54               
leveneTest(watermazedata$Working.Distance.Trial2.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.0259 0.9745
      54               
leveneTest(watermazedata$Working.Distance.Diff.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.8803 0.4205
      54               
# *** IF 1 OF 3 IS SIGNIFICANT [NOT NORMAL], DOES THAT REQUIRE NONPARAMETRIC? ***

Visually check each variable’s data for normality / outliers averaged across all groups. This info is probably not all that interestng until broken down by group. - Histograms w/ overlaid normal curves - Quantile–quantile (QQ) plots - Boxplots - Scatterplots - Violin plots

# Histograms with overlaid normal curve and Quantile–quantile plots
# Scatterplots:
# p <- ggplot(watermazedata, aes(x=Treatment, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
# use geom_crossbar()
# p + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")
# Use geom_errorbar()
# p + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), geom="errorbar", color="red", width=0.2) + stat_summary(fun.y=mean, geom="point", color="red")
# Use geom_pointrange()
# p + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), geom="pointrange", color="red")

# Duration

hist.Duration.Cued <- ggplot(watermazedata, aes(Duration.Cued)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Cued Duration", y = "Number")
hist.Duration.Cued +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Duration.Cued, na.rm = TRUE),
                  sd = sd(watermazedata$Duration.Cued, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Cued <- qplot(sample = watermazedata$Duration.Cued)
qqplot.Duration.Cued

boxplot(watermazedata$Duration.Cued, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Duration.Cued, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Duration.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Duration.Cued, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Duration.Spatial1 <- ggplot(watermazedata, aes(Duration.Spatial1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Duration.Spatial1, na.rm = TRUE),
                  sd = sd(watermazedata$Duration.Spatial1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial1 <- qplot(sample = watermazedata$Duration.Spatial1)
qqplot.Duration.Spatial1

boxplot(watermazedata$Duration.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Duration.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Duration.Spatial2 <- ggplot(watermazedata, aes(Duration.Spatial2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Duration.Spatial2, na.rm = TRUE),
                  sd = sd(watermazedata$Duration.Spatial2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial2 <- qplot(sample = watermazedata$Duration.Spatial2)
qqplot.Duration.Spatial2

boxplot(watermazedata$Duration.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Duration.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Duration.Spatial3 <- ggplot(watermazedata, aes(Duration.Spatial3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Duration.Spatial3, na.rm = TRUE),
                  sd = sd(watermazedata$Duration.Spatial3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial3 <- qplot(sample = watermazedata$Duration.Spatial3)
qqplot.Duration.Spatial3

boxplot(watermazedata$Duration.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Duration.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Duration.Spatial <- ggplot(watermazedata, aes(Duration.Spatial)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Duration.Spatial, na.rm = TRUE),
                  sd = sd(watermazedata$Duration.Spatial, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial <- qplot(sample = watermazedata$Duration.Spatial)
qqplot.Duration.Spatial

boxplot(watermazedata$Duration.Spatial, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Duration.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Distance

hist.Distance.Cued <- ggplot(watermazedata, aes(Distance.Cued)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Cued Distance", y = "Number")
hist.Distance.Cued +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Distance.Cued, na.rm = TRUE),
                  sd = sd(watermazedata$Distance.Cued, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Cued <- qplot(sample = watermazedata$Distance.Cued)
qqplot.Distance.Cued

boxplot(watermazedata$Distance.Cued, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Distance.Cued, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Distance.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Distance.Cued, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial1 <- ggplot(watermazedata, aes(Distance.Spatial1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Distance.Spatial1, na.rm = TRUE),
                  sd = sd(watermazedata$Distance.Spatial1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial1 <- qplot(sample = watermazedata$Distance.Spatial1)
qqplot.Distance.Spatial1

boxplot(watermazedata$Distance.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Distance.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial2 <- ggplot(watermazedata, aes(Distance.Spatial2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Distance.Spatial2, na.rm = TRUE),
                  sd = sd(watermazedata$Distance.Spatial2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial2 <- qplot(sample = watermazedata$Distance.Spatial2)
qqplot.Distance.Spatial2

boxplot(watermazedata$Distance.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Distance.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial3 <- ggplot(watermazedata, aes(Distance.Spatial3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Distance.Spatial3, na.rm = TRUE),
                  sd = sd(watermazedata$Distance.Spatial3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial3 <- qplot(sample = watermazedata$Distance.Spatial3)
qqplot.Distance.Spatial3

boxplot(watermazedata$Distance.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Distance.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial <- ggplot(watermazedata, aes(Distance.Spatial)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Distance.Spatial, na.rm = TRUE),
                  sd = sd(watermazedata$Distance.Spatial, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial <- qplot(sample = watermazedata$Distance.Spatial)
qqplot.Distance.Spatial

boxplot(watermazedata$Distance.Spatial, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Distance.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Speed

hist.Speed <- ggplot(watermazedata, aes(Speed)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Speed", y = "Number")
hist.Speed +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Speed, na.rm = TRUE),
                  sd = sd(watermazedata$Speed, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Speed <- qplot(sample = watermazedata$Speed)
qqplot.Speed

boxplot(watermazedata$Speed, main="Boxplots by Group", xlab="Group", ylab="Speed")

ggplot(watermazedata, aes(x=0, y=Speed, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Speed, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Probe stuff

hist.Probe.Entries.1 <- ggplot(watermazedata, aes(Probe.Entries.1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Entries", y = "Number")
hist.Probe.Entries.1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Probe.Entries.1, na.rm = TRUE),
                  sd = sd(watermazedata$Probe.Entries.1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.1 <- qplot(sample = watermazedata$Probe.Entries.1)
qqplot.Probe.Entries.1

boxplot(watermazedata$Probe.Entries.1, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Entries.1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Probe.Entries.2 <- ggplot(watermazedata, aes(Probe.Entries.2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Probe.Entries.2, na.rm = TRUE),
                  sd = sd(watermazedata$Probe.Entries.2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.2 <- qplot(sample = watermazedata$Probe.Entries.2)
qqplot.Probe.Entries.2

boxplot(watermazedata$Probe.Entries.2, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Entries.2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Probe.Entries.3 <- ggplot(watermazedata, aes(Probe.Entries.3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Probe.Entries.3, na.rm = TRUE),
                  sd = sd(watermazedata$Probe.Entries.3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.3 <- qplot(sample = watermazedata$Probe.Entries.3)
qqplot.Probe.Entries.3

boxplot(watermazedata$Probe.Entries.3, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Entries.3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Probe.Entries.Ave <- ggplot(watermazedata, aes(Probe.Entries.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Probe.Entries.Ave, na.rm = TRUE),
                  sd = sd(watermazedata$Probe.Entries.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.Ave <- qplot(sample = watermazedata$Probe.Entries.Ave)
qqplot.Probe.Entries.Ave

boxplot(watermazedata$Probe.Entries.Ave, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Entries.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Probe.Percent1 <- ggplot(watermazedata, aes(Probe.Percent1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Probe.Percent1, na.rm = TRUE),
                  sd = sd(watermazedata$Probe.Percent1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent1 <- qplot(sample = watermazedata$Probe.Percent1)
qqplot.Probe.Percent1

boxplot(watermazedata$Probe.Percent1, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(watermazedata, aes(x=0, y=Probe.Percent1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Percent1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Percent1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Probe.Percent2 <- ggplot(watermazedata, aes(Probe.Percent2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Probe.Percent2, na.rm = TRUE),
                  sd = sd(watermazedata$Probe.Percent2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent2 <- qplot(sample = watermazedata$Probe.Percent2)
qqplot.Probe.Percent2

boxplot(watermazedata$Probe.Percent2, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(watermazedata, aes(x=0, y=Probe.Percent2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Percent2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Percent2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Probe.Percent3 <- ggplot(watermazedata, aes(Probe.Percent3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Probe.Percent3, na.rm = TRUE),
                  sd = sd(watermazedata$Probe.Percent3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent3 <- qplot(sample = watermazedata$Probe.Percent3)
qqplot.Probe.Percent3

boxplot(watermazedata$Probe.Percent3, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(watermazedata, aes(x=0, y=Probe.Percent3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Percent3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Percent3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Probe.Percent.Ave <- ggplot(watermazedata, aes(Probe.Percent.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Probe.Percent.Ave, na.rm = TRUE),
                  sd = sd(watermazedata$Probe.Percent.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent.Ave <- qplot(sample = watermazedata$Probe.Percent.Ave)
qqplot.Probe.Percent.Ave

boxplot(watermazedata$Probe.Percent.Ave, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(watermazedata, aes(x=0, y=Probe.Percent.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Percent.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Percent.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe2.Opposite.Percent <- ggplot(watermazedata, aes(Probe2.Opposite.Percent)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe2.Opposite.Percent +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Probe2.Opposite.Percent, na.rm = TRUE),
                  sd = sd(watermazedata$Probe2.Opposite.Percent, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe2.Opposite.Percent <- qplot(sample = watermazedata$Probe2.Opposite.Percent)
qqplot.Probe2.Opposite.Percent

boxplot(watermazedata$Probe2.Opposite.Percent, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(watermazedata, aes(x=0, y=Probe2.Opposite.Percent, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe2.Opposite.Percent)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe2.Opposite.Percent, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



# Working memory stuff

hist.Working.Duration.Trial1.Ave <- ggplot(watermazedata, aes(Working.Duration.Trial1.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial1.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE),
                  sd = sd(watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Trial1.Ave <- qplot(sample = watermazedata$Working.Duration.Trial1.Ave)
qqplot.Working.Duration.Trial1.Ave

boxplot(watermazedata$Working.Duration.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial1.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial1.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Working.Duration.Trial2.Ave <- ggplot(watermazedata, aes(Working.Duration.Trial2.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial2.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE),
                  sd = sd(watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Trial2.Ave <- qplot(sample = watermazedata$Working.Duration.Trial2.Ave)
qqplot.Working.Duration.Trial2.Ave

boxplot(watermazedata$Working.Duration.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial2.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial2.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Duration.Diff.Ave <- ggplot(watermazedata, aes(Working.Duration.Diff.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Diff.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE),
                  sd = sd(watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Diff.Ave <- qplot(sample = watermazedata$Working.Duration.Diff.Ave)
qqplot.Working.Duration.Diff.Ave

boxplot(watermazedata$Working.Duration.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Diff.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Duration.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Diff.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Working.Distance.Trial1.Ave <- ggplot(watermazedata, aes(Working.Distance.Trial1.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial1.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE),
                  sd = sd(watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Trial1.Ave <- qplot(sample = watermazedata$Working.Distance.Trial1.Ave)
qqplot.Working.Distance.Trial1.Ave

boxplot(watermazedata$Working.Distance.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial1.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial1.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Working.Distance.Trial2.Ave <- ggplot(watermazedata, aes(Working.Distance.Trial2.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial2.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE),
                  sd = sd(watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Trial2.Ave <- qplot(sample = watermazedata$Working.Distance.Trial2.Ave)
qqplot.Working.Distance.Trial2.Ave

boxplot(watermazedata$Working.Distance.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial2.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial2.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Working.Distance.Diff.Ave <- ggplot(watermazedata, aes(Working.Distance.Diff.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Diff.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE),
                  sd = sd(watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Diff.Ave <- qplot(sample = watermazedata$Working.Distance.Diff.Ave)
qqplot.Working.Distance.Diff.Ave

boxplot(watermazedata$Working.Distance.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Diff.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Distance.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Diff.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")

Now, visually check each variable data for normality / outliers broken down by group - histograms and QQ plots and box plots for each Treatment group.

# Broken down by group (use the "subset" dataframes that were derived earlier)

# Ac
# Duration

hist.Duration.Cued <- ggplot(Ac_watermazedata, aes(Duration.Cued)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Cued Duration", y = "Number")
hist.Duration.Cued +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Duration.Cued, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Duration.Cued, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Cued <- qplot(sample = Ac_watermazedata$Duration.Cued)
qqplot.Duration.Cued

boxplot(Ac_watermazedata$Duration.Cued, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Duration.Spatial1 <- ggplot(Ac_watermazedata, aes(Duration.Spatial1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Duration.Spatial1, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Duration.Spatial1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial1 <- qplot(sample = Ac_watermazedata$Duration.Spatial1)
qqplot.Duration.Spatial1

boxplot(Ac_watermazedata$Duration.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Duration.Spatial2 <- ggplot(Ac_watermazedata, aes(Duration.Spatial2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Duration.Spatial2, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Duration.Spatial2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial2 <- qplot(sample = Ac_watermazedata$Duration.Spatial2)
qqplot.Duration.Spatial2

boxplot(Ac_watermazedata$Duration.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Duration.Spatial3 <- ggplot(Ac_watermazedata, aes(Duration.Spatial3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Duration.Spatial3, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Duration.Spatial3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial3 <- qplot(sample = Ac_watermazedata$Duration.Spatial3)
qqplot.Duration.Spatial3

boxplot(Ac_watermazedata$Duration.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Duration.Spatial <- ggplot(Ac_watermazedata, aes(Duration.Spatial)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Duration.Spatial, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Duration.Spatial, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial <- qplot(sample = Ac_watermazedata$Duration.Spatial)
qqplot.Duration.Spatial

boxplot(Ac_watermazedata$Duration.Spatial, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Distance

hist.Distance.Cued <- ggplot(Ac_watermazedata, aes(Distance.Cued)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Cued Distance", y = "Number")
hist.Distance.Cued +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Distance.Cued, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Distance.Cued, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Cued <- qplot(sample = Ac_watermazedata$Distance.Cued)
qqplot.Distance.Cued

boxplot(Ac_watermazedata$Distance.Cued, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial1 <- ggplot(Ac_watermazedata, aes(Distance.Spatial1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Distance.Spatial1, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Distance.Spatial1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial1 <- qplot(sample = Ac_watermazedata$Distance.Spatial1)
qqplot.Distance.Spatial1

boxplot(Ac_watermazedata$Distance.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial2 <- ggplot(Ac_watermazedata, aes(Distance.Spatial2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Distance.Spatial2, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Distance.Spatial2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial2 <- qplot(sample = Ac_watermazedata$Distance.Spatial2)
qqplot.Distance.Spatial2

boxplot(Ac_watermazedata$Distance.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial3 <- ggplot(Ac_watermazedata, aes(Distance.Spatial3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Distance.Spatial3, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Distance.Spatial3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial3 <- qplot(sample = Ac_watermazedata$Distance.Spatial3)
qqplot.Distance.Spatial3

boxplot(Ac_watermazedata$Distance.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial <- ggplot(Ac_watermazedata, aes(Distance.Spatial)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Distance.Spatial, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Distance.Spatial, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial <- qplot(sample = Ac_watermazedata$Distance.Spatial)
qqplot.Distance.Spatial

boxplot(Ac_watermazedata$Distance.Spatial, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Speed

hist.Speed <- ggplot(Ac_watermazedata, aes(Speed)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Speed", y = "Number")
hist.Speed +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Speed, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Speed, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Speed <- qplot(sample = Ac_watermazedata$Speed)
qqplot.Speed

boxplot(Ac_watermazedata$Speed, main="Boxplots by Group", xlab="Group", ylab="Speed")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



# Probe stuff

hist.Probe.Entries.1 <- ggplot(Ac_watermazedata, aes(Probe.Entries.1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Entries", y = "Number")
hist.Probe.Entries.1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Probe.Entries.1, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Probe.Entries.1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.1 <- qplot(sample = Ac_watermazedata$Probe.Entries.1)
qqplot.Probe.Entries.1

boxplot(Ac_watermazedata$Probe.Entries.1, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Entries.2 <- ggplot(Ac_watermazedata, aes(Probe.Entries.2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Probe.Entries.2, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Probe.Entries.2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.2 <- qplot(sample = Ac_watermazedata$Probe.Entries.2)
qqplot.Probe.Entries.2

boxplot(Ac_watermazedata$Probe.Entries.2, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Entries.3 <- ggplot(Ac_watermazedata, aes(Probe.Entries.3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Probe.Entries.3, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Probe.Entries.3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.3 <- qplot(sample = Ac_watermazedata$Probe.Entries.3)
qqplot.Probe.Entries.3

boxplot(Ac_watermazedata$Probe.Entries.3, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Entries.Ave <- ggplot(Ac_watermazedata, aes(Probe.Entries.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Probe.Entries.Ave, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Probe.Entries.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.Ave <- qplot(sample = Ac_watermazedata$Probe.Entries.Ave)
qqplot.Probe.Entries.Ave

boxplot(Ac_watermazedata$Probe.Entries.Ave, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent1 <- ggplot(Ac_watermazedata, aes(Probe.Percent1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Probe.Percent1, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Probe.Percent1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent1 <- qplot(sample = Ac_watermazedata$Probe.Percent1)
qqplot.Probe.Percent1

boxplot(Ac_watermazedata$Probe.Percent1, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent2 <- ggplot(Ac_watermazedata, aes(Probe.Percent2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Probe.Percent2, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Probe.Percent2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent2 <- qplot(sample = Ac_watermazedata$Probe.Percent2)
qqplot.Probe.Percent2

boxplot(Ac_watermazedata$Probe.Percent2, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent3 <- ggplot(Ac_watermazedata, aes(Probe.Percent3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Probe.Percent3, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Probe.Percent3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent3 <- qplot(sample = Ac_watermazedata$Probe.Percent3)
qqplot.Probe.Percent3

boxplot(Ac_watermazedata$Probe.Percent3, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent.Ave <- ggplot(Ac_watermazedata, aes(Probe.Percent.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Probe.Percent.Ave, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Probe.Percent.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent.Ave <- qplot(sample = Ac_watermazedata$Probe.Percent.Ave)
qqplot.Probe.Percent.Ave

boxplot(Ac_watermazedata$Probe.Percent.Ave, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe2.Opposite.Percent <- ggplot(Ac_watermazedata, aes(Probe2.Opposite.Percent)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe2.Opposite.Percent +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe2.Opposite.Percent <- qplot(sample = Ac_watermazedata$Probe2.Opposite.Percent)
qqplot.Probe2.Opposite.Percent

boxplot(Ac_watermazedata$Probe2.Opposite.Percent, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Working memory stuff

hist.Working.Duration.Trial1.Ave <- ggplot(Ac_watermazedata, aes(Working.Duration.Trial1.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial1.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Trial1.Ave <- qplot(sample = Ac_watermazedata$Working.Duration.Trial1.Ave)
qqplot.Working.Duration.Trial1.Ave

boxplot(Ac_watermazedata$Working.Duration.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Duration.Trial2.Ave <- ggplot(Ac_watermazedata, aes(Working.Duration.Trial2.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial2.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Trial2.Ave <- qplot(sample = Ac_watermazedata$Working.Duration.Trial2.Ave)
qqplot.Working.Duration.Trial2.Ave

boxplot(Ac_watermazedata$Working.Duration.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Duration.Diff.Ave <- ggplot(Ac_watermazedata, aes(Working.Duration.Diff.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Diff.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Diff.Ave <- qplot(sample = Ac_watermazedata$Working.Duration.Diff.Ave)
qqplot.Working.Duration.Diff.Ave

boxplot(Ac_watermazedata$Working.Duration.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Distance.Trial1.Ave <- ggplot(Ac_watermazedata, aes(Working.Distance.Trial1.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial1.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Trial1.Ave <- qplot(sample = Ac_watermazedata$Working.Distance.Trial1.Ave)
qqplot.Working.Distance.Trial1.Ave

boxplot(Ac_watermazedata$Working.Distance.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Distance.Trial2.Ave <- ggplot(Ac_watermazedata, aes(Working.Distance.Trial2.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial2.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Trial2.Ave <- qplot(sample = Ac_watermazedata$Working.Distance.Trial2.Ave)
qqplot.Working.Distance.Trial2.Ave

boxplot(Ac_watermazedata$Working.Distance.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Distance.Diff.Ave <- ggplot(Ac_watermazedata, aes(Working.Distance.Diff.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Diff.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Ac_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE),
                  sd = sd(Ac_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Diff.Ave <- qplot(sample = Ac_watermazedata$Working.Distance.Diff.Ave)
qqplot.Working.Distance.Diff.Ave

boxplot(Ac_watermazedata$Working.Distance.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Fx
# Duration

hist.Duration.Cued <- ggplot(Fx_watermazedata, aes(Duration.Cued)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Cued Duration", y = "Number")
hist.Duration.Cued +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Duration.Cued, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Duration.Cued, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Cued <- qplot(sample = Fx_watermazedata$Duration.Cued)
qqplot.Duration.Cued

boxplot(Fx_watermazedata$Duration.Cued, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Duration.Spatial1 <- ggplot(Fx_watermazedata, aes(Duration.Spatial1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Duration.Spatial1, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Duration.Spatial1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial1 <- qplot(sample = Fx_watermazedata$Duration.Spatial1)
qqplot.Duration.Spatial1

boxplot(Fx_watermazedata$Duration.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Duration.Spatial2 <- ggplot(Fx_watermazedata, aes(Duration.Spatial2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Duration.Spatial2, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Duration.Spatial2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial2 <- qplot(sample = Fx_watermazedata$Duration.Spatial2)
qqplot.Duration.Spatial2

boxplot(Fx_watermazedata$Duration.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Duration.Spatial3 <- ggplot(Fx_watermazedata, aes(Duration.Spatial3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Duration.Spatial3, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Duration.Spatial3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial3 <- qplot(sample = Fx_watermazedata$Duration.Spatial3)
qqplot.Duration.Spatial3

boxplot(Fx_watermazedata$Duration.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Duration.Spatial <- ggplot(Fx_watermazedata, aes(Duration.Spatial)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Duration.Spatial, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Duration.Spatial, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial <- qplot(sample = Fx_watermazedata$Duration.Spatial)
qqplot.Duration.Spatial

boxplot(Fx_watermazedata$Duration.Spatial, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Distance

hist.Distance.Cued <- ggplot(Fx_watermazedata, aes(Distance.Cued)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Cued Distance", y = "Number")
hist.Distance.Cued +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Distance.Cued, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Distance.Cued, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Cued <- qplot(sample = Fx_watermazedata$Distance.Cued)
qqplot.Distance.Cued

boxplot(Fx_watermazedata$Distance.Cued, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial1 <- ggplot(Fx_watermazedata, aes(Distance.Spatial1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Distance.Spatial1, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Distance.Spatial1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial1 <- qplot(sample = Fx_watermazedata$Distance.Spatial1)
qqplot.Distance.Spatial1

boxplot(Fx_watermazedata$Distance.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial2 <- ggplot(Fx_watermazedata, aes(Distance.Spatial2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Distance.Spatial2, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Distance.Spatial2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial2 <- qplot(sample = Fx_watermazedata$Distance.Spatial2)
qqplot.Distance.Spatial2

boxplot(Fx_watermazedata$Distance.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial3 <- ggplot(Fx_watermazedata, aes(Distance.Spatial3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Distance.Spatial3, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Distance.Spatial3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial3 <- qplot(sample = Fx_watermazedata$Distance.Spatial3)
qqplot.Distance.Spatial3

boxplot(Fx_watermazedata$Distance.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial <- ggplot(Fx_watermazedata, aes(Distance.Spatial)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Distance.Spatial, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Distance.Spatial, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial <- qplot(sample = Fx_watermazedata$Distance.Spatial)
qqplot.Distance.Spatial

boxplot(Fx_watermazedata$Distance.Spatial, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Speed

hist.Speed <- ggplot(Fx_watermazedata, aes(Speed)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Speed", y = "Number")
hist.Speed +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Speed, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Speed, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Speed <- qplot(sample = Fx_watermazedata$Speed)
qqplot.Speed

boxplot(Fx_watermazedata$Speed, main="Boxplots by Group", xlab="Group", ylab="Speed")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



# Probe stuff

hist.Probe.Entries.1 <- ggplot(Fx_watermazedata, aes(Probe.Entries.1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Entries", y = "Number")
hist.Probe.Entries.1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Probe.Entries.1, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Probe.Entries.1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.1 <- qplot(sample = Fx_watermazedata$Probe.Entries.1)
qqplot.Probe.Entries.1

boxplot(Fx_watermazedata$Probe.Entries.1, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Entries.2 <- ggplot(Fx_watermazedata, aes(Probe.Entries.2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Probe.Entries.2, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Probe.Entries.2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.2 <- qplot(sample = Fx_watermazedata$Probe.Entries.2)
qqplot.Probe.Entries.2

boxplot(Fx_watermazedata$Probe.Entries.2, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Entries.3 <- ggplot(Fx_watermazedata, aes(Probe.Entries.3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Probe.Entries.3, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Probe.Entries.3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.3 <- qplot(sample = Fx_watermazedata$Probe.Entries.3)
qqplot.Probe.Entries.3

boxplot(Fx_watermazedata$Probe.Entries.3, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Entries.Ave <- ggplot(Fx_watermazedata, aes(Probe.Entries.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Probe.Entries.Ave, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Probe.Entries.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.Ave <- qplot(sample = Fx_watermazedata$Probe.Entries.Ave)
qqplot.Probe.Entries.Ave

boxplot(Fx_watermazedata$Probe.Entries.Ave, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent1 <- ggplot(Fx_watermazedata, aes(Probe.Percent1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Probe.Percent1, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Probe.Percent1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent1 <- qplot(sample = Fx_watermazedata$Probe.Percent1)
qqplot.Probe.Percent1

boxplot(Fx_watermazedata$Probe.Percent1, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent2 <- ggplot(Fx_watermazedata, aes(Probe.Percent2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Probe.Percent2, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Probe.Percent2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent2 <- qplot(sample = Fx_watermazedata$Probe.Percent2)
qqplot.Probe.Percent2

boxplot(Fx_watermazedata$Probe.Percent2, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent3 <- ggplot(Fx_watermazedata, aes(Probe.Percent3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Probe.Percent3, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Probe.Percent3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent3 <- qplot(sample = Fx_watermazedata$Probe.Percent3)
qqplot.Probe.Percent3

boxplot(Fx_watermazedata$Probe.Percent3, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent.Ave <- ggplot(Fx_watermazedata, aes(Probe.Percent.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Probe.Percent.Ave, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Probe.Percent.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent.Ave <- qplot(sample = Fx_watermazedata$Probe.Percent.Ave)
qqplot.Probe.Percent.Ave

boxplot(Fx_watermazedata$Probe.Percent.Ave, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe2.Opposite.Percent <- ggplot(Fx_watermazedata, aes(Probe2.Opposite.Percent)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe2.Opposite.Percent +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe2.Opposite.Percent <- qplot(sample = Fx_watermazedata$Probe2.Opposite.Percent)
qqplot.Probe2.Opposite.Percent

boxplot(Fx_watermazedata$Probe2.Opposite.Percent, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Working memory stuff

hist.Working.Duration.Trial1.Ave <- ggplot(Fx_watermazedata, aes(Working.Duration.Trial1.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial1.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Trial1.Ave <- qplot(sample = Fx_watermazedata$Working.Duration.Trial1.Ave)
qqplot.Working.Duration.Trial1.Ave

boxplot(Fx_watermazedata$Working.Duration.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Duration.Trial2.Ave <- ggplot(Fx_watermazedata, aes(Working.Duration.Trial2.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial2.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Trial2.Ave <- qplot(sample = Fx_watermazedata$Working.Duration.Trial2.Ave)
qqplot.Working.Duration.Trial2.Ave

boxplot(Fx_watermazedata$Working.Duration.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Duration.Diff.Ave <- ggplot(Fx_watermazedata, aes(Working.Duration.Diff.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Diff.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Diff.Ave <- qplot(sample = Fx_watermazedata$Working.Duration.Diff.Ave)
qqplot.Working.Duration.Diff.Ave

boxplot(Fx_watermazedata$Working.Duration.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Distance.Trial1.Ave <- ggplot(Fx_watermazedata, aes(Working.Distance.Trial1.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial1.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Trial1.Ave <- qplot(sample = Fx_watermazedata$Working.Distance.Trial1.Ave)
qqplot.Working.Distance.Trial1.Ave

boxplot(Fx_watermazedata$Working.Distance.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Distance.Trial2.Ave <- ggplot(Fx_watermazedata, aes(Working.Distance.Trial2.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial2.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Trial2.Ave <- qplot(sample = Fx_watermazedata$Working.Distance.Trial2.Ave)
qqplot.Working.Distance.Trial2.Ave

boxplot(Fx_watermazedata$Working.Distance.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Distance.Diff.Ave <- ggplot(Fx_watermazedata, aes(Working.Distance.Diff.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Diff.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Fx_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE),
                  sd = sd(Fx_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Diff.Ave <- qplot(sample = Fx_watermazedata$Working.Distance.Diff.Ave)
qqplot.Working.Distance.Diff.Ave

boxplot(Fx_watermazedata$Working.Distance.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Sh
# Duration

hist.Duration.Cued <- ggplot(Sh_watermazedata, aes(Duration.Cued)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Cued Duration", y = "Number")
hist.Duration.Cued +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Duration.Cued, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Duration.Cued, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Cued <- qplot(sample = Sh_watermazedata$Duration.Cued)
qqplot.Duration.Cued

boxplot(Sh_watermazedata$Duration.Cued, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Duration.Spatial1 <- ggplot(Sh_watermazedata, aes(Duration.Spatial1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Duration.Spatial1, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Duration.Spatial1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial1 <- qplot(sample = Sh_watermazedata$Duration.Spatial1)
qqplot.Duration.Spatial1

boxplot(Sh_watermazedata$Duration.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



hist.Duration.Spatial2 <- ggplot(Sh_watermazedata, aes(Duration.Spatial2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Duration.Spatial2, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Duration.Spatial2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial2 <- qplot(sample = Sh_watermazedata$Duration.Spatial2)
qqplot.Duration.Spatial2

boxplot(Sh_watermazedata$Duration.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Duration.Spatial3 <- ggplot(Sh_watermazedata, aes(Duration.Spatial3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Duration.Spatial3, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Duration.Spatial3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial3 <- qplot(sample = Sh_watermazedata$Duration.Spatial3)
qqplot.Duration.Spatial3

boxplot(Sh_watermazedata$Duration.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Duration.Spatial <- ggplot(Sh_watermazedata, aes(Duration.Spatial)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Duration.Spatial, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Duration.Spatial, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Duration.Spatial <- qplot(sample = Sh_watermazedata$Duration.Spatial)
qqplot.Duration.Spatial

boxplot(Sh_watermazedata$Duration.Spatial, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Distance

hist.Distance.Cued <- ggplot(Sh_watermazedata, aes(Distance.Cued)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Cued Distance", y = "Number")
hist.Distance.Cued +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Distance.Cued, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Distance.Cued, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Cued <- qplot(sample = Sh_watermazedata$Distance.Cued)
qqplot.Distance.Cued

boxplot(Sh_watermazedata$Distance.Cued, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial1 <- ggplot(Sh_watermazedata, aes(Distance.Spatial1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Distance.Spatial1, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Distance.Spatial1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial1 <- qplot(sample = Sh_watermazedata$Distance.Spatial1)
qqplot.Distance.Spatial1

boxplot(Sh_watermazedata$Distance.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial2 <- ggplot(Sh_watermazedata, aes(Distance.Spatial2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Distance.Spatial2, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Distance.Spatial2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial2 <- qplot(sample = Sh_watermazedata$Distance.Spatial2)
qqplot.Distance.Spatial2

boxplot(Sh_watermazedata$Distance.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial3 <- ggplot(Sh_watermazedata, aes(Distance.Spatial3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Distance.Spatial3, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Distance.Spatial3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial3 <- qplot(sample = Sh_watermazedata$Distance.Spatial3)
qqplot.Distance.Spatial3

boxplot(Sh_watermazedata$Distance.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Distance.Spatial <- ggplot(Sh_watermazedata, aes(Distance.Spatial)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Distance.Spatial, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Distance.Spatial, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Distance.Spatial <- qplot(sample = Sh_watermazedata$Distance.Spatial)
qqplot.Distance.Spatial

boxplot(Sh_watermazedata$Distance.Spatial, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Speed

hist.Speed <- ggplot(Sh_watermazedata, aes(Speed)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Speed", y = "Number")
hist.Speed +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Speed, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Speed, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Speed <- qplot(sample = Sh_watermazedata$Speed)
qqplot.Speed

boxplot(Sh_watermazedata$Speed, main="Boxplots by Group", xlab="Group", ylab="Speed")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")



# Probe stuff

hist.Probe.Entries.1 <- ggplot(Sh_watermazedata, aes(Probe.Entries.1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Average Entries", y = "Number")
hist.Probe.Entries.1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Probe.Entries.1, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Probe.Entries.1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.1 <- qplot(sample = Sh_watermazedata$Probe.Entries.1)
qqplot.Probe.Entries.1

boxplot(Sh_watermazedata$Probe.Entries.1, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Entries.2 <- ggplot(Sh_watermazedata, aes(Probe.Entries.2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Probe.Entries.2, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Probe.Entries.2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.2 <- qplot(sample = Sh_watermazedata$Probe.Entries.2)
qqplot.Probe.Entries.2

boxplot(Sh_watermazedata$Probe.Entries.2, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Entries.3 <- ggplot(Sh_watermazedata, aes(Probe.Entries.3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Probe.Entries.3, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Probe.Entries.3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.3 <- qplot(sample = Sh_watermazedata$Probe.Entries.3)
qqplot.Probe.Entries.3

boxplot(Sh_watermazedata$Probe.Entries.3, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Entries.Ave <- ggplot(Sh_watermazedata, aes(Probe.Entries.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Entries", y = "Number")
hist.Probe.Entries.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Probe.Entries.Ave, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Probe.Entries.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Entries.Ave <- qplot(sample = Sh_watermazedata$Probe.Entries.Ave)
qqplot.Probe.Entries.Ave

boxplot(Sh_watermazedata$Probe.Entries.Ave, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent1 <- ggplot(Sh_watermazedata, aes(Probe.Percent1)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent1 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Probe.Percent1, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Probe.Percent1, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent1 <- qplot(sample = Sh_watermazedata$Probe.Percent1)
qqplot.Probe.Percent1

boxplot(Sh_watermazedata$Probe.Percent1, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent2 <- ggplot(Sh_watermazedata, aes(Probe.Percent2)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent2 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Probe.Percent2, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Probe.Percent2, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent2 <- qplot(sample = Sh_watermazedata$Probe.Percent2)
qqplot.Probe.Percent2

boxplot(Sh_watermazedata$Probe.Percent2, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent3 <- ggplot(Sh_watermazedata, aes(Probe.Percent3)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent3 +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Probe.Percent3, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Probe.Percent3, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent3 <- qplot(sample = Sh_watermazedata$Probe.Percent3)
qqplot.Probe.Percent3

boxplot(Sh_watermazedata$Probe.Percent3, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe.Percent.Ave <- ggplot(Sh_watermazedata, aes(Probe.Percent.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe.Percent.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Probe.Percent.Ave, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Probe.Percent.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe.Percent.Ave <- qplot(sample = Sh_watermazedata$Probe.Percent.Ave)
qqplot.Probe.Percent.Ave

boxplot(Sh_watermazedata$Probe.Percent.Ave, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Probe2.Opposite.Percent <- ggplot(Sh_watermazedata, aes(Probe2.Opposite.Percent)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Percent", y = "Number")
hist.Probe2.Opposite.Percent +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Probe2.Opposite.Percent <- qplot(sample = Sh_watermazedata$Probe2.Opposite.Percent)
qqplot.Probe2.Opposite.Percent

boxplot(Sh_watermazedata$Probe2.Opposite.Percent, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Working memory stuff

hist.Working.Duration.Trial1.Ave <- ggplot(Sh_watermazedata, aes(Working.Duration.Trial1.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial1.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Trial1.Ave <- qplot(sample = Sh_watermazedata$Working.Duration.Trial1.Ave)
qqplot.Working.Duration.Trial1.Ave

boxplot(Sh_watermazedata$Working.Duration.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Duration.Trial2.Ave <- ggplot(Sh_watermazedata, aes(Working.Duration.Trial2.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial2.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Trial2.Ave <- qplot(sample = Sh_watermazedata$Working.Duration.Trial2.Ave)
qqplot.Working.Duration.Trial2.Ave

boxplot(Sh_watermazedata$Working.Duration.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Duration.Diff.Ave <- ggplot(Sh_watermazedata, aes(Working.Duration.Diff.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Duration", y = "Number")
hist.Working.Duration.Diff.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Duration.Diff.Ave <- qplot(sample = Sh_watermazedata$Working.Duration.Diff.Ave)
qqplot.Working.Duration.Diff.Ave

boxplot(Sh_watermazedata$Working.Duration.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Distance.Trial1.Ave <- ggplot(Sh_watermazedata, aes(Working.Distance.Trial1.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial1.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Trial1.Ave <- qplot(sample = Sh_watermazedata$Working.Distance.Trial1.Ave)
qqplot.Working.Distance.Trial1.Ave

boxplot(Sh_watermazedata$Working.Distance.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Distance.Trial2.Ave <- ggplot(Sh_watermazedata, aes(Working.Distance.Trial2.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial2.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Trial2.Ave <- qplot(sample = Sh_watermazedata$Working.Distance.Trial2.Ave)
qqplot.Working.Distance.Trial2.Ave

boxplot(Sh_watermazedata$Working.Distance.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


hist.Working.Distance.Diff.Ave <- ggplot(Sh_watermazedata, aes(Working.Distance.Diff.Ave)) + 
  geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
  labs(x = "Distance", y = "Number")
hist.Working.Distance.Diff.Ave +
  stat_function(fun = dnorm, args = list
                (mean = mean(Sh_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE),
                  sd = sd(Sh_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE)),
                colour = "black", size = 1)

qqplot.Working.Distance.Diff.Ave <- qplot(sample = Sh_watermazedata$Working.Distance.Diff.Ave)
qqplot.Working.Distance.Diff.Ave

boxplot(Sh_watermazedata$Working.Distance.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")

Now visually compare groups against each other

# Broken down by group all on 1 graph

# Duration

ggplot(watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Duration.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Distance

ggplot(watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Distance.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Speed

ggplot(watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Probe stuff

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


# Working memory stuff

ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")


ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  geom_jitter(color="black", size=0.4, alpha=0.9) +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("A boxplot with jitter") +
  xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
  geom_violin() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
  theme_ipsum() +
  theme(
    legend.position="none",
    plot.title = element_text(size=11)
  ) +
  ggtitle("Violin chart") +
  xlab("")

Meeting assumptions of normality / homogeneity of variance can be tough w/ large data sets because small variations can be “significant” (you can also test homogeneity of variance w/ “variance ratio” or Hartley’s Fmax). Either way, if data are not normally distributed and of equal variances, parametric tests are not valid. To correct “problems” with the data:

Outliers - remove the case / subject (especially if it was somehow “different”) - “bring the case it into the fold” using the mean + 2 or 3 SDs - Change the score to be the mean + 2 or 3 SDs - “bring the case into the fold” using the next highest score plus one method - Change the score to be one unit above the next highest score in the data set

For non-normally-distributed data: - Can also use “trimmed means” (removing a specific % of cases have been removed from each end) - Can also use “M-estimator” which empirically derives the proper % to trim - Can also use bootstrapping to estimate “true” mean / variance - Transform the data: log, square root, or reciprocal transformations can correct for positive skew and/or unequal variance. If data are negatively skewed, you need derive a reciprocal score (reverse the scores by subtracting each score from the highest score obtained) – Make new transformed DVs using newVariable <- function(oldVariable) — Square root: watermazedata\(Duration.Spatial.Sqrt <- sqrt(watermazedata\)Duration.Spatial) — Absolute value: watermazedata\(Duration.Spatial.Abs <- abs(watermazedata\)Duration.Spatial.Diff) — Log (natural): watermazedata\(Duration.Spatial.Log <- log(watermazedata\)Duration.Spatial +1) +1 needed to avoid trying to calculate log of 0 — Log (base 10): watermazedata\(Duration.Spatial.Log10 <- log10(watermazedata\)Duration.Spatial) +1 needed for base 10??? — Reciprocal: watermazedata\(Duration.Spatial.Reciprocal <- 1/(watermazedata\)Duration.Spatial +1) +1 needed to avoid trying to divide by zero

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayAtIEVEQSB3b3JrZmxvdyB0ZW1wbGF0ZSB1c2luZyBOZWxzb24gZGF0YSIKYXV0aG9yOiAiUmljaCBIYXJ0bWFuLCBQaEQiCmRhdGU6ICJEZWNlbWJlciAxOHRoLCAyMDE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgppbnN0YWxsIHJlcXVpcmVkIHBhY2thZ2VzIChvbmx5IG5lZWQgdG8gZG8gdGhpcyBvbmNlPykKCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKTsgIyBmb3IgZ3JhcGhpY3MgZnVuY3Rpb25zCmluc3RhbGwucGFja2FnZXMoImNhciIpOyAjIGZvciB0aGUgbGV2ZW5lVGVzdCgpIGZ1bmN0aW9uCmluc3RhbGwucGFja2FnZXMoInBhc3RlY3MiKTsgIyBmb3IgdGhlIHN0YXQuZGVzYygpIGZ1bmN0aW9uCmluc3RhbGwucGFja2FnZXMoInBzeWNoIik7ICMgZm9yIHRoZSBkZXNjcmliZSgpIGZ1bmN0aW9uCmluc3RhbGwucGFja2FnZXMoImhyYnJ0aGVtZXMiKQppbnN0YWxsLnBhY2thZ2VzKCJ2aXJpZGlzIikKCiJjYWxsIiB0aGUgcmVxdWlyZWQgcGFja2FnZXMgKG5lZWQgdG8gZG8gdGhpcyBldmVyeSBzZXNzaW9uPykKCmBgYHtyfQpsaWJyYXJ5KGNhcik7IGxpYnJhcnkoZ2dwbG90Mik7IGxpYnJhcnkocGFzdGVjcyk7IGxpYnJhcnkocHN5Y2gpOyBsaWJyYXJ5KGhyYnJ0aGVtZXMpOyBsaWJyYXJ5KHZpcmlkaXMpCmBgYAoKVXNlIEV4Y2VsIHRvIGdlbmVyYXRlIGEgLmNzdiBmaWxlIHdpdGggInRpZHkiIGRhdGEgKGVhY2ggcm93ID0gMSBjYXNlIC8gc3ViamVjdCwgMXN0IHJvdyBpcyBjb2x1bW4gbmFtZXMpLiBJbXBvcnQgLkNTViBmaWxlIGludG8gUiAiZGF0YWZyYW1lIiBjYWxsZWQgIndhdGVybWF6ZWRhdGEiLiBUaGVuIHNob3cgdGhlICJ3YXRlcm1hemVkYXRhIiBkYXRhZnJhbWUgKGhlYWRlciArIDFzdCA4IGRhdGEgcm93cykgdG8gY2hlY2sgaXQgb3V0CgpgYGB7cn0Kd2F0ZXJtYXplZGF0YSA8LSByZWFkLmNzdihmaWxlPSIuL2RhdGFfY2xlYW4vd2F0ZXIgbWF6ZSBhbGwuY3N2IiwgaGVhZGVyPVRSVUUsIHNlcD0iLCIpCndhdGVybWF6ZWRhdGEKYGBgCgpEZXJpdmUgbmV3IHZhcmlhYmxlcy4gTW9zdGx5IHVzZSB0aGUgcm93TWVhbnMoKSBmdW5jdGlvbiwgYnV0IHRoZXNlIG1heSBiZSB1c2VmdWwgYXMgd2VsbC4uLgoKTWFrZSBzb21lIG5ldyBEVnMgKH4iY29sdW1ucyIpIGFzc2lnbmVkIDEgKFRSVUUpIG9yIDAgKEZBTFNFKSBiYXNlZCBvbiBCb29sZWFuIGNhbGN1bGF0aW9uczoKLSBMZXNzIHRoYW4/IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDJMZXNzVGhhblNwYXRpYWwxIDwtIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIgPCB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyCi0gTGVzcyB0aGFuIG9yIGVxdWFsIHRvPyB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxTGVzc1RoYW5PckVxdWFsVG82MCA8LSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyIDw9IDYwCi0gRXF1YWwgdG8/IHdhdGVybWF6ZWRhdGEkU2ggPC0gd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQgPT0gIlNoIgotIE5vdCBlcXVhbCB0bz8gd2F0ZXJtYXplZGF0YSROb3RTaCA8LSB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCAhPSAiU2giCgpVc2UgImlmZWxzZSIgdG8gbWF5YmUgcmVwbGFjZSBzY29yZXMgKGUuZy4sIHJlcGxhY2UgYW55IGR1cmF0aW9uIGdyZWF0ZXIgdGhhbiA2MCB3aXRoIE5BICJtaXNzaW5nIGRhdGEiLCBlbHNlIGtlZXAgdGhlIHNhbWUpCi0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLkNsZWFuIDwtIGlmZWxzZSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwgPiA2MCwgTkEsIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCkKCmBgYHtyfQojIFRyaWFscyAxLTEwIGZvciBjdWVkLCBzcGF0aWFsIDEsIHNwYXRpYWwgMiBhbmQgc3BhdGlhbCB0cmlhbHMgYXZlcmFnZWQgaW50byA1IGJsb2NrcyAoMiB0cmlhbHMgZWFjaCkgZWFjaCBmb3IgYm90aCBEaXN0YW5jZSBhbmQgRHVyYXRpb24Kd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLkJsb2NrMSA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC4yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC5CbG9jazIgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQuNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQuQmxvY2szIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLjYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLkJsb2NrNCA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQuNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC44KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC5CbG9jazUgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQuMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuQmxvY2sxIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS4yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLkJsb2NrMiA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS5CbG9jazMgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuQmxvY2s0IDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS44KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLkJsb2NrNSA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS45LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCgp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLkJsb2NrMSA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi5CbG9jazIgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuQmxvY2szIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi42KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLkJsb2NrNCA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi43LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi5CbG9jazUgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjEwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQoKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy5CbG9jazEgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuQmxvY2syIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy40KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLkJsb2NrMyA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy5CbG9jazQgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuQmxvY2s1IDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4xMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZC5CbG9jazEgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuQmxvY2syIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZC4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLjQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLkJsb2NrMyA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZC42KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZC5CbG9jazQgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuQmxvY2s1IDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZC45LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLjEwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCgp3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLkJsb2NrMSA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS5CbG9jazIgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuQmxvY2szIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS42KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLkJsb2NrNCA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS43LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS5CbG9jazUgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjEwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQoKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi5CbG9jazEgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuQmxvY2syIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi40KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLkJsb2NrMyA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi5CbG9jazQgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuQmxvY2s1IDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi4xMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuQmxvY2sxIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLkJsb2NrMiA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy5CbG9jazMgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLjYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuQmxvY2s0IDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy44KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLkJsb2NrNSA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy45LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCgojIEN1ZWQsIHNwYXRpYWwgMSwgc3BhdGlhbCAyIGFuZCBzcGF0aWFsIGJsb2NrcyAxLTUgYXZlcmFnZWQgaW50byBPdmVyYWxsIEF2ZXJhZ2VzIGZvciBib3RoIERpc3RhbmNlIGFuZCBEdXJhdGlvbgp3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQgPC0gcm93TWVhbnMoY2JpbmQgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSA8LSByb3dNZWFucyhjYmluZCAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiA8LSByb3dNZWFucyhjYmluZCAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMyA8LSByb3dNZWFucyhjYmluZCAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsIDwtIHJvd01lYW5zKGNiaW5kICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCgoKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkIDwtIHJvd01lYW5zKGNiaW5kICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEgPC0gcm93TWVhbnMoY2JpbmQgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIgPC0gcm93TWVhbnMoY2JpbmQgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMgPC0gcm93TWVhbnMoY2JpbmQgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCA8LSByb3dNZWFucyhjYmluZCAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQoKIyBNYWtlIGEgU3BlZWQgdmFyaWFibGUgKERpc3RhbmNlL0R1cmF0aW9uKQp3YXRlcm1hemVkYXRhJFNwZWVkIDwtIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCAvIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbAoKIyBNYWtlIHdvcmtpbmcgbWVtb3J5IHZhcmlhYmxlcwp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLjEgPC0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS4xCndhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuMSA8LSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjIKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuMSA8LSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjEgLSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjIKCndhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuMiA8LSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjEKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi4yIDwtIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMgp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi4yIDwtIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMSAtIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMgoKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS4zIDwtIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuMQp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLjMgPC0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4yCndhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLjMgPC0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4xIC0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4yCgp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSA8LSAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS4xICsgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi4xICsgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4xKSAvIDMKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUgPC0gKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuMiArIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMiArIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuMikgLyAzCndhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSA8LSAod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuMSArIHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLjIgKyB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi4zKSAvIDMKCgp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLjEgPC0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS4xCndhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuMSA8LSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjIKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuMSA8LSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjEgLSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjIKCndhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuMiA8LSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjEKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi4yIDwtIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMgp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi4yIDwtIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMSAtIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMgoKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS4zIDwtIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuMQp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLjMgPC0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4yCndhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLjMgPC0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4xIC0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4yCgp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSA8LSAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS4xICsgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi4xICsgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4xKSAvIDMKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgPC0gKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuMiArIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMiArIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuMikgLyAzCndhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSA8LSAod2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuMSArIHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLjIgKyB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi4zKSAvIDMKCmBgYAoKQ3JlYXRlIGEgInN1YnNldCIgZGF0YWZyYW1lIGZvciBlYWNoIGdyb3VwIHRvIGVhc2UgbWFraW5nIGhpc3RvZ3JhbXMvbm9ybWFsIGN1cnZlcyBhbmQgUVEgcGxvdHMgYnkgZ3JvdXAuCgpgYGB7cn0KQWNfd2F0ZXJtYXplZGF0YTwtc3Vic2V0KHdhdGVybWF6ZWRhdGEsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50PT0iQWMiKQpGeF93YXRlcm1hemVkYXRhPC1zdWJzZXQod2F0ZXJtYXplZGF0YSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQ9PSJGeCIpClNoX3dhdGVybWF6ZWRhdGE8LXN1YnNldCh3YXRlcm1hemVkYXRhLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudD09IlNoIikKYGBgCgpIb3cgbWFueSBzdWJqZWN0cyBhcmUgbWlzc2luZyBkYXRhIGZyb20gYSBzcGVjaWZpYyBjb2x1bW4/IChuYSA9ICdtaXNzaW5nJykuIE1ha2UgYSB2YXJpYWJsZSB0aGF0IHJldHVybnMgMSAoVFJVRSkgaWYgZGF0YSBpcyBtaXNzaW5nOgp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLk1pc3NpbmcgPC0gaXMubmEod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSkKCkhvdyBtYW55IHN1YmplY3RzIGFyZSBtaXNzaW5nIGZyb20gRHVyYXRpb24uU3BhdGlhbDEgZGF0YT8Kc3VtKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuTWlzc2luZykKCjEgPSBtaXNzaW5nLCAwID0gdGhlcmUsIHNvIG1lYW4gd2lsbCB0ZWxsIHVzIHByb3BvcnRpb24gb2YgY2FzZXMgbWlzc2luZyBkYXRhIGluIHRoYXQgdmFyaWFibGUKCi4uLi5vciBzaW1wbHkgY2FsY3VsYXRlIHRoaXMgV0lUSE9VVCBtYWtpbmcgYSBuZXcgdmFyaWFibGU6CgpgYGB7cn0Kc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMikpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMykpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwpKQoKc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMikpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMykpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwpKQoKc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkU3BlZWQpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJFNwZWVkKSkKCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xKSkKc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIpKQpzdW0oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMykpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MikpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MykpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50KSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkpCgpzdW0oaXMubmEod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKSkKc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkpCgpzdW0oaXMubmEod2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlKSkKc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkpCmBgYAoKTm93LCBzdGFydCBjaGVja2luZyB0aGUgdmFyaW91cyBhdXNzdW1wdGlvbnMgKG5vcm1hbGl0eSwgaG9tb2dlbmVpdHkgb2YgdmFyaWFuY2UsIGV0Yy4pIGZvciBhbGwgKm1lYW5pbmdmdWwgRFZTKiAtIGUuZy4sIEF2ZXJhZ2UgRGlzdGFuY2UgYW5kIERpc3RhbmNlIGZvciBkYXlzIDEtMyBhcmUgcHJvYmFibHkgaW1wb3J0YW50LCBidXQgQmxvY2tzIDEtNSBmcm9tIGVhY2ggYXJlICpwcm9iYWJseSogbm90ICg/KS4gSWYgdGhlIGlkZWEgaXMgdG8gY29tcGFyZSBncm91cHMsIHRoZSBhc3N1bXB0aW9ucyBuZWVkIHRvIGJlIHRlc3RlZCB3aXRoIGVhY2ggdmFyaWFibGUgYnJva2VuIGRvd24gYnkgZ3JvdXAuCgo/Pz8gaXMgdGhlcmUgYSAiQm9uZmVycm9uaSBjb3JyZWN0aW9uIiBmb3IgbXVsdGlwbGUgdGVzdHMgb2YgTm9ybWFsaXR5IGV0YyA/Pz8KCkdlbmVyYXRlIHNvbWUgZGVzY3JpcHRpdmUgc3RhdHMgZm9yIHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QuCgpOT1RFOiBGb3Igb3V0cHV0IHJlcG9ydGVkIHVzaW5nICJlIjogZSswMiwgc2ltcGx5ICJtb3ZlIiB0aGUgZGVjaW1hbCBwb2ludCAyIHBsYWNlcyB0byByaWdodC4gZS0wMiA9IG1vdmUgZGVjaW1hbCAyIHBsYWNlcyB0byBsZWZ0Li4uCgpDYW4gdXNlIGRlc2NyaWJlKCkgKGZyb20gdGhlIHBzeWNoIHBhY2thZ2UpIG9yIHN0YXQuZGVzYygpIGZ1bmN0aW9uIChmcm9tIHRoZSBwYXN0ZWNzIHBhY2thZ2UpIHRvIGdldCBzb21lIGJhc2ljIHN0YXRzLgoKYGBge3J9CiMgZGVzY3JpYmUoKQojIE92ZXJhbGwgRFZzIChub3QgYnJva2VuIGRvd24gYnkgZ3JvdXApCiMgc2luZ2xlIHZhcmlhYmxlczogYnkoZGF0YSA9IGRhdGFGcmFtZSRWYXJpYWJsZSwgSU5ESUNFUyA9IGRhdGFGcmFtZSRncm91cGluZyBEViwgRlVOID0gZnVuY3Rpb24pCiMgYnkoZGF0YSA9IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgSU5ESUNFUyA9IHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBGVU4gPSBkZXNjcmliZSkKIyBvcgojIGJ5KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIGRlc2NyaWJlKQojIG11bHRpcGxlIHZhcmlhYmxlcyBhdCBvbmNlOgojIGRlc2NyaWJlKGNiaW5kKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsCiMgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsCiMgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsCiMgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFNwZWVkLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUsCiMgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMsCiMgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUpKQojIG9yCiMgZGVzY3JpYmUod2F0ZXJtYXplZGF0YVssYygiRHVyYXRpb24uU3BhdGlhbDEiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVyYXRpb24uU3BhdGlhbDIiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVyYXRpb24uU3BhdGlhbDMiKV0pOyAjIEVUQwoKIyBicm9rZW4gZG93biBieSBncm91cAojYnkoY2JpbmQoRHVyYXRpb24uQ3VlZD13YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQsCiMgICAgICAgICBEdXJhdGlvbi5TcGF0aWFsMT13YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLAojICAgICAgICAgRHVyYXRpb24uU3BhdGlhbDI9d2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiwKIyAgICAgICAgIER1cmF0aW9uLlNwYXRpYWwzPXdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMsCiMgICAgICAgICBEdXJhdGlvbi5TcGF0aWFsPXdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwKIyAgICAgICAgIERpc3RhbmNlLkN1ZWQ9d2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLAojICAgICAgICAgRGlzdGFuY2UuU3BhdGlhbDE9d2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwKIyAgICAgICAgIERpc3RhbmNlLlNwYXRpYWwyPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsCiMgICAgICAgICBEaXN0YW5jZS5TcGF0aWFsMz13YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLAojICAgICAgICAgRGlzdGFuY2UuU3BhdGlhbD13YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwsCiMgICAgICAgICBTcGVlZD13YXRlcm1hemVkYXRhJFNwZWVkLAojICAgICAgICAgUHJvYmUuRW50cmllcy4xPXdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLAojICAgICAgICAgUHJvYmUuRW50cmllcy4yPXdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLAojICAgICAgICAgUHJvYmUuRW50cmllcy4zPXdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLAojICAgICAgICAgUHJvYmUuRW50cmllcy5BdmU9d2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwKIyAgICAgICAgIFByb2JlLlBlcmNlbnQxPXdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEsCiMgICAgICAgICBQcm9iZS5QZXJjZW50Mj13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLAojICAgICAgICAgUHJvYmUuUGVyY2VudDM9d2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywKIyAgICAgICAgIFByb2JlLlBlcmNlbnQuQXZlPXdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUsCiMgICAgICAgICBQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudD13YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LAojICAgICAgICAgV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlPXdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLAojICAgICAgICAgV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlPXdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLAojICAgICAgICAgV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZT13YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsCiMgICAgICAgICBXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmU9d2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsCiMgICAgICAgICBXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmU9d2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsCiMgICAgICAgICBXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlPXdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSksCiMgICB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgZGVzY3JpYmUpCgojIG5vcm1hbGl0eSBvZiBvdmVyYWxsIHZhcmlhYmxlcwojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCkKIyBzaGFwaXJvLnRlc3Qod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkU3BlZWQpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMikKIyBzaGFwaXJvLnRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkKIyBzaGFwaXJvLnRlc3Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkKIyBzaGFwaXJvLnRlc3Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkKCiMgbm9ybWFsaXR5IG9mIHZhcmlhYmxlcyBicm9rZW4gZG93biBieSBncm91cAojIGJ5KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCiMgYnkod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCiMgYnkod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCiMgYnkod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFNwZWVkLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCiMgYnkod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCiMgYnkod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCmBgYAoKVXNpbmcgc3RhdC5kZXNjCgpgYGB7cn0KCiMgc3RhdC5kZXNjKCkKIyB1c2luZyBiYXNpYyA9IEZBTFNFIGFkZHMgU2hhcGlyby1XaWxrcyB0ZXN0LCBuZWdhdGluZyB0aGUgbmVlZCB0byBydW4gdGhhdCBzZXBhcmF0ZWx5IGFzIHdpdGggZGVzY3JpYmUoKQojIE92ZXJhbGwgRFZzIChub3QgYnJva2VuIGRvd24gYnkgZ3JvdXApCnN0YXQuZGVzYyhjYmluZChEdXJhdGlvbi5DdWVkPXdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwKICAgICAgICAgICAgICAgIER1cmF0aW9uLlNwYXRpYWwxPXdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsCiAgICAgICAgICAgICAgICBEdXJhdGlvbi5TcGF0aWFsMj13YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLAogICAgICAgICAgICAgICAgRHVyYXRpb24uU3BhdGlhbDM9d2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywKICAgICAgICAgICAgICAgIER1cmF0aW9uLlNwYXRpYWw9d2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLAogICAgICAgICAgICAgICAgRGlzdGFuY2UuQ3VlZD13YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsCiAgICAgICAgICAgICAgICBEaXN0YW5jZS5TcGF0aWFsMT13YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLAogICAgICAgICAgICAgICAgRGlzdGFuY2UuU3BhdGlhbDI9d2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwKICAgICAgICAgICAgICAgIERpc3RhbmNlLlNwYXRpYWwzPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsCiAgICAgICAgICAgICAgICBEaXN0YW5jZS5TcGF0aWFsPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwKICAgICAgICAgICAgICAgIFNwZWVkPXdhdGVybWF6ZWRhdGEkU3BlZWQsCiAgICAgICAgICAgICAgICBQcm9iZS5FbnRyaWVzLjE9d2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsCiAgICAgICAgICAgICAgICBQcm9iZS5FbnRyaWVzLjI9d2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIsCiAgICAgICAgICAgICAgICBQcm9iZS5FbnRyaWVzLjM9d2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMsCiAgICAgICAgICAgICAgICBQcm9iZS5FbnRyaWVzLkF2ZT13YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLAogICAgICAgICAgICAgICAgUHJvYmUuUGVyY2VudDE9d2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwKICAgICAgICAgICAgICAgIFByb2JlLlBlcmNlbnQyPXdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsCiAgICAgICAgICAgICAgICBQcm9iZS5QZXJjZW50Mz13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLAogICAgICAgICAgICAgICAgUHJvYmUuUGVyY2VudC5BdmU9d2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwKICAgICAgICAgICAgICAgIFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50PXdhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsCiAgICAgICAgICAgICAgICBXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmU9d2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsCiAgICAgICAgICAgICAgICBXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmU9d2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsCiAgICAgICAgICAgICAgICBXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlPXdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwKICAgICAgICAgICAgICAgIFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZT13YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwKICAgICAgICAgICAgICAgIFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZT13YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwKICAgICAgICAgICAgICAgIFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmU9d2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlKSwKICAgICAgICAgIGJhc2ljID0gRkFMU0UsIG5vcm0gPSBUUlVFKQojIG9yCiMgc3RhdC5kZXNjKHdhdGVybWF6ZWRhdGFbLCBjKCJEdXJhdGlvbi5TcGF0aWFsMSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1cmF0aW9uLlNwYXRpYWwyIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVyYXRpb24uU3BhdGlhbDMiKV0sIGJhc2ljID0gRkFMU0UsIG5vcm0gPSBUUlVFKTsgIyBFVEMKCiMgQnJva2VuIGRvd24gYnkgZ3JvdXAKIyBzaW5nbGUgdmFyaWFibGVzOiBieShkYXRhID0gZGF0YUZyYW1lJFZhcmlhYmxlLCBJTkRJQ0VTID0gZGF0YUZyYW1lJGdyb3VwaW5nIERWLCBGVU4gPSBmdW5jdGlvbikKIyBieShkYXRhID0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLCBJTkRJQ0VTID0gd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIEZVTiA9IHN0YXQuZGVzYykKIyBvcgojIGJ5KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHN0YXQuZGVzYykKIyBvcgojIGJ5KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHN0YXQuZGVzYywgYmFzaWMgPSBGQUxTRSwgbm9ybSA9IFRSVUUpCiMgbXVsdGlwbGUgdmFyaWFibGVzIGF0IG9uY2U6CmJ5KGNiaW5kKER1cmF0aW9uLkN1ZWQ9d2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLAogICAgICAgICBEdXJhdGlvbi5TcGF0aWFsMT13YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLAogICAgICAgICBEdXJhdGlvbi5TcGF0aWFsMj13YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLAogICAgICAgICBEdXJhdGlvbi5TcGF0aWFsMz13YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLAogICAgICAgICBEdXJhdGlvbi5TcGF0aWFsPXdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwKICAgICAgICAgRGlzdGFuY2UuQ3VlZD13YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsCiAgICAgICAgIERpc3RhbmNlLlNwYXRpYWwxPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsCiAgICAgICAgIERpc3RhbmNlLlNwYXRpYWwyPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsCiAgICAgICAgIERpc3RhbmNlLlNwYXRpYWwzPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsCiAgICAgICAgIERpc3RhbmNlLlNwYXRpYWw9d2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsLAogICAgICAgICBTcGVlZD13YXRlcm1hemVkYXRhJFNwZWVkLAogICAgICAgICBQcm9iZS5FbnRyaWVzLjE9d2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsCiAgICAgICAgIFByb2JlLkVudHJpZXMuMj13YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwKICAgICAgICAgUHJvYmUuRW50cmllcy4zPXdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLAogICAgICAgICBQcm9iZS5FbnRyaWVzLkF2ZT13YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLAogICAgICAgICBQcm9iZS5QZXJjZW50MT13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLAogICAgICAgICBQcm9iZS5QZXJjZW50Mj13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLAogICAgICAgICBQcm9iZS5QZXJjZW50Mz13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLAogICAgICAgICBQcm9iZS5QZXJjZW50LkF2ZT13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLAogICAgICAgICBQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudD13YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50KSwKICAgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHN0YXQuZGVzYywgYmFzaWMgPSBGQUxTRSwgbm9ybSA9IFRSVUUpCiMgb3IKIyBieSh3YXRlcm1hemVkYXRhWywgYygiRHVyYXRpb24uU3BhdGlhbDEiLAojICAgICAgICAgICAgICAgICAgICAgIkR1cmF0aW9uLlNwYXRpYWwxIiwKIyAgICAgICAgICAgICAgICAgICAgICJEdXJhdGlvbi5TcGF0aWFsMyIpXSw7ICNFVEMKIyAgIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzdGF0LmRlc2MsIGJhc2ljID0gRkFMU0UsIG5vcm0gPSBUUlVFKQoKYGBgCgpUZXN0IGZvciBob21vZ2VuZWl0eSBvZiB2YXJpYW5jZSBhbW9uZyBncm91cHMgdXNpbmcgdGhlIGxldmVuZVRlc3QoKSBmdW5jdGlvbiBmcm9tIHRoZSBjYXIgcGFja2FnZSAoZGVmYXVsdCB1c2VzIG1lZGlhbikuLi4gdG8gdXNlIG1lYW4gaW5zdGVhZCBvZiBtZWRpYW4gLSBmb3IgZXhhbXBsZToKbGV2ZW5lVGVzdCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBjZW50ZXIgPSBtZWFuKQoKYGBge3J9CgpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCkKbGV2ZW5lVGVzdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRTcGVlZCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCkKbGV2ZW5lVGVzdCh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMywgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50Miwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50Mywgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCkKbGV2ZW5lVGVzdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCkKbGV2ZW5lVGVzdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCkKCiMgKioqIElGIDEgT0YgMyBJUyBTSUdOSUZJQ0FOVCBbTk9UIE5PUk1BTF0sIERPRVMgVEhBVCBSRVFVSVJFIE5PTlBBUkFNRVRSSUM/ICoqKgpgYGAKClZpc3VhbGx5IGNoZWNrIGVhY2ggdmFyaWFibGUncyBkYXRhIGZvciBub3JtYWxpdHkgLyBvdXRsaWVycyBhdmVyYWdlZCBhY3Jvc3MgYWxsIGdyb3Vwcy4gVGhpcyBpbmZvIGlzIHByb2JhYmx5IG5vdCBhbGwgdGhhdCBpbnRlcmVzdG5nIHVudGlsIGJyb2tlbiBkb3duIGJ5IGdyb3VwLgotIEhpc3RvZ3JhbXMgdy8gb3ZlcmxhaWQgbm9ybWFsIGN1cnZlcwotIFF1YW50aWxl4oCTcXVhbnRpbGUgKFFRKSBwbG90cwotIEJveHBsb3RzCi0gU2NhdHRlcnBsb3RzCi0gVmlvbGluIHBsb3RzCgpgYGB7cn0KIyBIaXN0b2dyYW1zIHdpdGggb3ZlcmxhaWQgbm9ybWFsIGN1cnZlIGFuZCBRdWFudGlsZeKAk3F1YW50aWxlIHBsb3RzCiMgU2NhdHRlcnBsb3RzOgojIHAgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1TcGVlZCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKIyB1c2UgZ2VvbV9jcm9zc2JhcigpCiMgcCArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQojIFVzZSBnZW9tX2Vycm9yYmFyKCkKIyBwICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iZXJyb3JiYXIiLCBjb2xvcj0icmVkIiwgd2lkdGg9MC4yKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBnZW9tPSJwb2ludCIsIGNvbG9yPSJyZWQiKQojIFVzZSBnZW9tX3BvaW50cmFuZ2UoKQojIHAgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJwb2ludHJhbmdlIiwgY29sb3I9InJlZCIpCgojIER1cmF0aW9uCgpoaXN0LkR1cmF0aW9uLkN1ZWQgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5DdWVkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBDdWVkIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLkN1ZWQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLkN1ZWQgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkKQpxcXBsb3QuRHVyYXRpb24uQ3VlZApib3hwbG90KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uQ3VlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EdXJhdGlvbi5DdWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EdXJhdGlvbi5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLlNwYXRpYWwxKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLlNwYXRpYWwxICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwxIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMQpib3hwbG90KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PUR1cmF0aW9uLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PUR1cmF0aW9uLlNwYXRpYWwxKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EdXJhdGlvbi5TcGF0aWFsMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRHVyYXRpb24uU3BhdGlhbDIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5TcGF0aWFsMikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMiA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDIKYm94cGxvdCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EdXJhdGlvbi5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EdXJhdGlvbi5TcGF0aWFsMikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkR1cmF0aW9uLlNwYXRpYWwzIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbDMpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uU3BhdGlhbDMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDMgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMykKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwzCmJveHBsb3Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uU3BhdGlhbDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PUR1cmF0aW9uLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwKYm94cGxvdCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PUR1cmF0aW9uLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uU3BhdGlhbCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCiMgRGlzdGFuY2UKCmhpc3QuRGlzdGFuY2UuQ3VlZCA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLkN1ZWQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIEN1ZWQgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuQ3VlZCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuQ3VlZCA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQpCnFxcGxvdC5EaXN0YW5jZS5DdWVkCmJveHBsb3Qod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PURpc3RhbmNlLkN1ZWQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PURpc3RhbmNlLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwxIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuU3BhdGlhbDEpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDEgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwxCmJveHBsb3Qod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RGlzdGFuY2UuU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RGlzdGFuY2UuU3BhdGlhbDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PURpc3RhbmNlLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMiA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLlNwYXRpYWwyKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwyICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwyIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMgpib3hwbG90KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PURpc3RhbmNlLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PURpc3RhbmNlLlNwYXRpYWwyKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDMgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsMykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMyArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMyA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDMKYm94cGxvdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5TcGF0aWFsMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5TcGF0aWFsMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RGlzdGFuY2UuU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbApib3hwbG90KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RGlzdGFuY2UuU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5TcGF0aWFsKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5TcGF0aWFsLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKIyBTcGVlZAoKaGlzdC5TcGVlZCA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFNwZWVkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGVlZCIsIHkgPSAiTnVtYmVyIikKaGlzdC5TcGVlZCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJFNwZWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkU3BlZWQsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5TcGVlZCA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJFNwZWVkKQpxcXBsb3QuU3BlZWQKYm94cGxvdCh3YXRlcm1hemVkYXRhJFNwZWVkLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iU3BlZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1TcGVlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1TcGVlZCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9U3BlZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFByb2JlIHN0dWZmCgpoaXN0LlByb2JlLkVudHJpZXMuMSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuMSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgRW50cmllcyIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5FbnRyaWVzLjEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjEgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjEKYm94cGxvdCh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5FbnRyaWVzLjEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuRW50cmllcy4xKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5FbnRyaWVzLjEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5Qcm9iZS5FbnRyaWVzLjIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLjIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJFbnRyaWVzIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLkVudHJpZXMuMiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLkVudHJpZXMuMiA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMikKcXFwbG90LlByb2JlLkVudHJpZXMuMgpib3hwbG90KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRW50cmllcyIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLkVudHJpZXMuMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5FbnRyaWVzLjIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLkVudHJpZXMuMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgpoaXN0LlByb2JlLkVudHJpZXMuMyA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuMykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy4zICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy4zIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zKQpxcXBsb3QuUHJvYmUuRW50cmllcy4zCmJveHBsb3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJFbnRyaWVzIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuRW50cmllcy4zLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLkVudHJpZXMuMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuRW50cmllcy4zLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuUHJvYmUuRW50cmllcy5BdmUgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSkKcXFwbG90LlByb2JlLkVudHJpZXMuQXZlCmJveHBsb3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5FbnRyaWVzLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5FbnRyaWVzLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuRW50cmllcy5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5Qcm9iZS5QZXJjZW50MSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQxKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50MSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50MSA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDEKYm94cGxvdCh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLlBlcmNlbnQxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLlBlcmNlbnQxKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5QZXJjZW50MSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgpoaXN0LlByb2JlLlBlcmNlbnQyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuUGVyY2VudDIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLlBlcmNlbnQyICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLlBlcmNlbnQyIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIpCnFxcGxvdC5Qcm9iZS5QZXJjZW50Mgpib3hwbG90KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuUGVyY2VudDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuUGVyY2VudDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLlBlcmNlbnQyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuUHJvYmUuUGVyY2VudDMgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5QZXJjZW50MykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuUGVyY2VudDMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDMgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MykKcXFwbG90LlByb2JlLlBlcmNlbnQzCmJveHBsb3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5QZXJjZW50MywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5QZXJjZW50MykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuUGVyY2VudDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5Qcm9iZS5QZXJjZW50LkF2ZSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50LkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50LkF2ZSA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlKQpxcXBsb3QuUHJvYmUuUGVyY2VudC5BdmUKYm94cGxvdCh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLlBlcmNlbnQuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLlBlcmNlbnQuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5QZXJjZW50LkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkKcXFwbG90LlByb2JlMi5PcHBvc2l0ZS5QZXJjZW50CmJveHBsb3Qod2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKIyBXb3JraW5nIG1lbW9yeSBzdHVmZgoKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUKYm94cGxvdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlCmJveHBsb3Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUKYm94cGxvdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkRpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZQpib3hwbG90KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUKYm94cGxvdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUKYm94cGxvdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmBgYAoKTm93LCB2aXN1YWxseSBjaGVjayBlYWNoIHZhcmlhYmxlIGRhdGEgZm9yIG5vcm1hbGl0eSAvIG91dGxpZXJzIGJyb2tlbiBkb3duIGJ5IGdyb3VwIC0gaGlzdG9ncmFtcyBhbmQgUVEgcGxvdHMgYW5kIGJveCBwbG90cyBmb3IgZWFjaCBUcmVhdG1lbnQgZ3JvdXAuCgpgYGB7cn0KIyBCcm9rZW4gZG93biBieSBncm91cCAodXNlIHRoZSAic3Vic2V0IiBkYXRhZnJhbWVzIHRoYXQgd2VyZSBkZXJpdmVkIGVhcmxpZXIpCgojIEFjCiMgRHVyYXRpb24KCmhpc3QuRHVyYXRpb24uQ3VlZCA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLkN1ZWQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIEN1ZWQgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uQ3VlZCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uQ3VlZCA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQpCnFxcGxvdC5EdXJhdGlvbi5DdWVkCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5DdWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMSA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLlNwYXRpYWwxKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLlNwYXRpYWwxICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwxIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMQpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgpoaXN0LkR1cmF0aW9uLlNwYXRpYWwyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbDIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uU3BhdGlhbDIgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDIgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMikKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwyCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwyKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMyA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLlNwYXRpYWwzKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLlNwYXRpYWwzICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwzIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMwpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRHVyYXRpb24uU3BhdGlhbCA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLlNwYXRpYWwpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uU3BhdGlhbCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbCA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIERpc3RhbmNlCgpoaXN0LkRpc3RhbmNlLkN1ZWQgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5DdWVkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBDdWVkIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLkN1ZWQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLkN1ZWQgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkKQpxcXBsb3QuRGlzdGFuY2UuQ3VlZApib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuQ3VlZCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMSA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLlNwYXRpYWwxKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwxICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwxIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMQpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsMikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMiA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDIKYm94cGxvdChBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwzIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuU3BhdGlhbDMpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDMgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMykKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwzCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwzKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EaXN0YW5jZS5TcGF0aWFsIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuU3BhdGlhbCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5TcGF0aWFsICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwKYm94cGxvdChBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCiMgU3BlZWQKCmhpc3QuU3BlZWQgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhTcGVlZCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BlZWQiLCB5ID0gIk51bWJlciIpCmhpc3QuU3BlZWQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRTcGVlZCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJFNwZWVkLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuU3BlZWQgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRTcGVlZCkKcXFwbG90LlNwZWVkCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSRTcGVlZCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlNwZWVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1TcGVlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVNwZWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVNwZWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCiMgUHJvYmUgc3R1ZmYKCmhpc3QuUHJvYmUuRW50cmllcy4xIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuRW50cmllcy4xKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBFbnRyaWVzIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLkVudHJpZXMuMSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLkVudHJpZXMuMSA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSkKcXFwbG90LlByb2JlLkVudHJpZXMuMQpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRW50cmllcyIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4xLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4xKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuRW50cmllcy4yIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuRW50cmllcy4yKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRW50cmllcyIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5FbnRyaWVzLjIgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjIgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjIKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLkVudHJpZXMuMyA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuMykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy4zICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy4zIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zKQpxcXBsb3QuUHJvYmUuRW50cmllcy4zCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJFbnRyaWVzIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4zLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5FbnRyaWVzLkF2ZSA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRW50cmllcyIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5FbnRyaWVzLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlKQpxcXBsb3QuUHJvYmUuRW50cmllcy5BdmUKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRW50cmllcyIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuUGVyY2VudDEgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5QZXJjZW50MSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuUGVyY2VudDEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDEgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSkKcXFwbG90LlByb2JlLlBlcmNlbnQxCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLlBlcmNlbnQyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuUGVyY2VudDIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLlBlcmNlbnQyICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLlBlcmNlbnQyIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIpCnFxcGxvdC5Qcm9iZS5QZXJjZW50Mgpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQyKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5QZXJjZW50MyA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQzKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50MyArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50MyA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzKQpxcXBsb3QuUHJvYmUuUGVyY2VudDMKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuUGVyY2VudC5BdmUgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5QZXJjZW50LkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuUGVyY2VudC5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuUGVyY2VudC5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSkKcXFwbG90LlByb2JlLlBlcmNlbnQuQXZlCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudC5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudC5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlMi5PcHBvc2l0ZS5QZXJjZW50IDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlMi5PcHBvc2l0ZS5QZXJjZW50ICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlMi5PcHBvc2l0ZS5QZXJjZW50IDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQpCnFxcGxvdC5Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudApib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlMi5PcHBvc2l0ZS5QZXJjZW50KSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKIyBXb3JraW5nIG1lbW9yeSBzdHVmZgoKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkR1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZQpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkRpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZQpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKIyBGeAojIER1cmF0aW9uCgpoaXN0LkR1cmF0aW9uLkN1ZWQgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5DdWVkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBDdWVkIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLkN1ZWQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLkN1ZWQgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkKQpxcXBsb3QuRHVyYXRpb24uQ3VlZApib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uQ3VlZCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuRHVyYXRpb24uU3BhdGlhbDEgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5TcGF0aWFsMSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMSA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDEKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMiA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLlNwYXRpYWwyKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLlNwYXRpYWwyICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwyIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMgpib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRHVyYXRpb24uU3BhdGlhbDMgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5TcGF0aWFsMykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMyArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMyA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDMKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkR1cmF0aW9uLlNwYXRpYWwgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5TcGF0aWFsKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLlNwYXRpYWwgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbApib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKIyBEaXN0YW5jZQoKaGlzdC5EaXN0YW5jZS5DdWVkIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuQ3VlZCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgQ3VlZCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5DdWVkICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5DdWVkIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCkKcXFwbG90LkRpc3RhbmNlLkN1ZWQKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuQ3VlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLkN1ZWQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuQ3VlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDEgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsMSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMSA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDEKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuU3BhdGlhbDIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDIgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDIgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMikKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwyCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwyKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMyA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLlNwYXRpYWwzKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwzICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMywgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwzIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMwpib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRGlzdGFuY2UuU3BhdGlhbCA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLlNwYXRpYWwpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuU3BhdGlhbCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbCA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFNwZWVkCgpoaXN0LlNwZWVkIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoU3BlZWQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwZWVkIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlNwZWVkICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkU3BlZWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSRTcGVlZCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlNwZWVkIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkU3BlZWQpCnFxcGxvdC5TcGVlZApib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkU3BlZWQsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJTcGVlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9U3BlZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1TcGVlZCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1TcGVlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgojIFByb2JlIHN0dWZmCgpoaXN0LlByb2JlLkVudHJpZXMuMSA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuMSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgRW50cmllcyIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5FbnRyaWVzLjEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjEgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjEKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLkVudHJpZXMuMiA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuMikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy4yICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy4yIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yKQpxcXBsb3QuUHJvYmUuRW50cmllcy4yCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJFbnRyaWVzIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4yLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5FbnRyaWVzLjMgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLjMpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJFbnRyaWVzIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLkVudHJpZXMuMyArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMywgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLkVudHJpZXMuMyA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMykKcXFwbG90LlByb2JlLkVudHJpZXMuMwpib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRW50cmllcyIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4zLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4zKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuRW50cmllcy5BdmUgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSkKcXFwbG90LlByb2JlLkVudHJpZXMuQXZlCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLlBlcmNlbnQxIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuUGVyY2VudDEpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLlBlcmNlbnQxICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLlBlcmNlbnQxIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50MQpib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQxKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5QZXJjZW50MiA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQyKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50MiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50MiA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyKQpxcXBsb3QuUHJvYmUuUGVyY2VudDIKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuUGVyY2VudDMgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5QZXJjZW50MykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuUGVyY2VudDMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDMgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MykKcXFwbG90LlByb2JlLlBlcmNlbnQzCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLlBlcmNlbnQuQXZlIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuUGVyY2VudC5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLlBlcmNlbnQuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLlBlcmNlbnQuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUpCnFxcGxvdC5Qcm9iZS5QZXJjZW50LkF2ZQpib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50LkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50KSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50KQpxcXBsb3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCiMgV29ya2luZyBtZW1vcnkgc3R1ZmYKCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCiMgU2gKIyBEdXJhdGlvbgoKaGlzdC5EdXJhdGlvbi5DdWVkIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uQ3VlZCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgQ3VlZCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5DdWVkICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5DdWVkIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCkKcXFwbG90LkR1cmF0aW9uLkN1ZWQKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uQ3VlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLkN1ZWQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uQ3VlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgpoaXN0LkR1cmF0aW9uLlNwYXRpYWwxIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbDEpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uU3BhdGlhbDEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDEgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwxCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwxKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuRHVyYXRpb24uU3BhdGlhbDIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5TcGF0aWFsMikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMiA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDIKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkR1cmF0aW9uLlNwYXRpYWwzIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbDMpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uU3BhdGlhbDMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDMgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMykKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwzCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwzKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCiMgRGlzdGFuY2UKCmhpc3QuRGlzdGFuY2UuQ3VlZCA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLkN1ZWQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIEN1ZWQgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuQ3VlZCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuQ3VlZCA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQpCnFxcGxvdC5EaXN0YW5jZS5DdWVkCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5DdWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwxIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuU3BhdGlhbDEpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDEgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwxCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwxKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMiA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLlNwYXRpYWwyKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwyICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwyIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMgpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDMgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsMykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMyArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMyA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDMKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbApib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKIyBTcGVlZAoKaGlzdC5TcGVlZCA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFNwZWVkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGVlZCIsIHkgPSAiTnVtYmVyIikKaGlzdC5TcGVlZCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFNwZWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkU3BlZWQsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5TcGVlZCA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFNwZWVkKQpxcXBsb3QuU3BlZWQKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJFNwZWVkLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iU3BlZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVNwZWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9U3BlZWQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9U3BlZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKIyBQcm9iZSBzdHVmZgoKaGlzdC5Qcm9iZS5FbnRyaWVzLjEgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLjEpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIEVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy4xICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy4xIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xKQpxcXBsb3QuUHJvYmUuRW50cmllcy4xCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJFbnRyaWVzIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4xLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5FbnRyaWVzLjIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLjIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJFbnRyaWVzIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLkVudHJpZXMuMiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLkVudHJpZXMuMiA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMikKcXFwbG90LlByb2JlLkVudHJpZXMuMgpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRW50cmllcyIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4yLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4yKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuRW50cmllcy4zIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuRW50cmllcy4zKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRW50cmllcyIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5FbnRyaWVzLjMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjMgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjMKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLkVudHJpZXMuQXZlIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuRW50cmllcy5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJFbnRyaWVzIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLkVudHJpZXMuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLkVudHJpZXMuQXZlIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLkF2ZQpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJFbnRyaWVzIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5QZXJjZW50MSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQxKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50MSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50MSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDEKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuUGVyY2VudDIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5QZXJjZW50MikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuUGVyY2VudDIgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDIgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MikKcXFwbG90LlByb2JlLlBlcmNlbnQyCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MiwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLlBlcmNlbnQzIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuUGVyY2VudDMpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLlBlcmNlbnQzICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLlBlcmNlbnQzIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMpCnFxcGxvdC5Qcm9iZS5QZXJjZW50Mwpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQzKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5QZXJjZW50LkF2ZSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50LkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50LkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlKQpxcXBsb3QuUHJvYmUuUGVyY2VudC5BdmUKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudC5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50LkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50LkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkKcXFwbG90LlByb2JlMi5PcHBvc2l0ZS5QZXJjZW50CmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFdvcmtpbmcgbWVtb3J5IHN0dWZmCgpoaXN0LldvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkR1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZQpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LldvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkR1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZQpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LldvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkRpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZQpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkRpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZQpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LldvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpgYGAKCk5vdyB2aXN1YWxseSBjb21wYXJlIGdyb3VwcyBhZ2FpbnN0IGVhY2ggb3RoZXIKCmBgYHtyfQojIEJyb2tlbiBkb3duIGJ5IGdyb3VwIGFsbCBvbiAxIGdyYXBoCgojIER1cmF0aW9uCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5DdWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIERpc3RhbmNlCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5DdWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFNwZWVkCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVNwZWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9U3BlZWQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9U3BlZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFByb2JlIHN0dWZmCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudC5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudC5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFdvcmtpbmcgbWVtb3J5IHN0dWZmCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCmBgYAoKCk1lZXRpbmcgYXNzdW1wdGlvbnMgb2Ygbm9ybWFsaXR5IC8gaG9tb2dlbmVpdHkgb2YgdmFyaWFuY2UgY2FuIGJlIHRvdWdoIHcvIGxhcmdlIGRhdGEgc2V0cyBiZWNhdXNlIHNtYWxsIHZhcmlhdGlvbnMgY2FuIGJlICJzaWduaWZpY2FudCIgKHlvdSBjYW4gYWxzbyB0ZXN0IGhvbW9nZW5laXR5IG9mIHZhcmlhbmNlIHcvICJ2YXJpYW5jZSByYXRpbyIgb3IgSGFydGxleSdzIEZtYXgpLiBFaXRoZXIgd2F5LCBpZiBkYXRhIGFyZSBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgYW5kIG9mIGVxdWFsIHZhcmlhbmNlcywgcGFyYW1ldHJpYyB0ZXN0cyBhcmUgbm90IHZhbGlkLiBUbyBjb3JyZWN0ICJwcm9ibGVtcyIgd2l0aCB0aGUgZGF0YToKCk91dGxpZXJzCi0gcmVtb3ZlIHRoZSBjYXNlIC8gc3ViamVjdCAoZXNwZWNpYWxseSBpZiBpdCB3YXMgc29tZWhvdyAiZGlmZmVyZW50IikKLSAiYnJpbmcgdGhlIGNhc2UgaXQgaW50byB0aGUgZm9sZCIgdXNpbmcgdGhlIG1lYW4gKyAyIG9yIDMgU0RzIC0gQ2hhbmdlIHRoZSBzY29yZSB0byBiZSB0aGUgbWVhbiArIDIgb3IgMyBTRHMKLSAiYnJpbmcgdGhlIGNhc2UgaW50byB0aGUgZm9sZCIgdXNpbmcgdGhlIG5leHQgaGlnaGVzdCBzY29yZSBwbHVzIG9uZSBtZXRob2QgLSBDaGFuZ2UgdGhlIHNjb3JlIHRvIGJlIG9uZSB1bml0IGFib3ZlIHRoZSBuZXh0IGhpZ2hlc3Qgc2NvcmUgaW4gdGhlIGRhdGEgc2V0CgpGb3Igbm9uLW5vcm1hbGx5LWRpc3RyaWJ1dGVkIGRhdGE6Ci0gQ2FuIGFsc28gdXNlICJ0cmltbWVkIG1lYW5zIiAocmVtb3ZpbmcgYSBzcGVjaWZpYyAlIG9mIGNhc2VzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gZWFjaCBlbmQpCi0gQ2FuIGFsc28gdXNlICJNLWVzdGltYXRvciIgd2hpY2ggZW1waXJpY2FsbHkgZGVyaXZlcyB0aGUgcHJvcGVyICUgdG8gdHJpbQotIENhbiBhbHNvIHVzZSBib290c3RyYXBwaW5nIHRvIGVzdGltYXRlICJ0cnVlIiBtZWFuIC8gdmFyaWFuY2UKLSBUcmFuc2Zvcm0gdGhlIGRhdGE6IGxvZywgc3F1YXJlIHJvb3QsIG9yIHJlY2lwcm9jYWwgdHJhbnNmb3JtYXRpb25zIGNhbiBjb3JyZWN0IGZvciBwb3NpdGl2ZSBza2V3IGFuZC9vciB1bmVxdWFsIHZhcmlhbmNlLiBJZiBkYXRhIGFyZSBuZWdhdGl2ZWx5IHNrZXdlZCwgeW91IG5lZWQgZGVyaXZlIGEgcmVjaXByb2NhbCBzY29yZSAocmV2ZXJzZSB0aGUgc2NvcmVzIGJ5IHN1YnRyYWN0aW5nIGVhY2ggc2NvcmUgZnJvbSB0aGUgaGlnaGVzdCBzY29yZSBvYnRhaW5lZCkKLS0gTWFrZSBuZXcgdHJhbnNmb3JtZWQgRFZzIHVzaW5nIG5ld1ZhcmlhYmxlIDwtIGZ1bmN0aW9uKG9sZFZhcmlhYmxlKQotLS0gU3F1YXJlIHJvb3Q6IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbC5TcXJ0IDwtIHNxcnQod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsKQotLS0gQWJzb2x1dGUgdmFsdWU6IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbC5BYnMgPC0gYWJzKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbC5EaWZmKQotLS0gTG9nIChuYXR1cmFsKTogd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLkxvZyA8LSBsb2cod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsICsxKQorMSBuZWVkZWQgdG8gYXZvaWQgdHJ5aW5nIHRvIGNhbGN1bGF0ZSBsb2cgb2YgMAotLS0gTG9nIChiYXNlIDEwKTogd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLkxvZzEwIDwtIGxvZzEwKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCkKKzEgbmVlZGVkIGZvciBiYXNlIDEwPz8/Ci0tLSBSZWNpcHJvY2FsOiB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwuUmVjaXByb2NhbCA8LSAxLyh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwgKzEpICArMSBuZWVkZWQgdG8gYXZvaWQgdHJ5aW5nIHRvIGRpdmlkZSBieSB6ZXJv